PySpark写入DataFrame至ClickHouse数据库时遇Py4J错误求助
问题:Spark写入ClickHouse时出现Py4J错误
我从HDFS获取JSON数据转换为DataFrame后,尝试写入ClickHouse数据库时出现如下错误:
at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
at py4j.commands.CallCommand.execute(CallCommand.java:79)
at py4j.GatewayConnection.run(GatewayConnection.java:238)
at java.lang.Thread.run(Thread.java:748)
Spark版本:2.3.1,PySpark版本:2.3.1
尝试过两段代码:
代码1:
df.write \ .jdbc("jdbc:clickhouse://adqm2.gu.local:8123", "esia_dev.bill_agg_test", properties={"user": "user", "password": "password"})
代码2:
df.write \ .format("jdbc") \ .mode("append") \ .option("driver", "ru.yandex.clickhouse.ClickHouseDriver") \ .option("url", "jdbc:clickhouse://adqm2.gu.local:8123/esia_dev")\ .option("driver", "ru.yandex.clickhouse.ClickHouseDriver")\ .option("dbtable", "esia_dev.bill_agg_test")\ .option("user", "user") \ .option("password", "password")\ .save()
附:将DataFrame保存为CSV文件时可正常运行。
排查方向与解决方案
1. 确认ClickHouse JDBC驱动已加载
Spark 2.3.1不内置ClickHouse的JDBC驱动,必须确保任务提交时已引入兼容的驱动包:
- 提交任务时通过
--jars参数指定驱动路径,示例:
驱动版本需与ClickHouse服务版本匹配,建议使用对应大版本的驱动。spark-submit --jars clickhouse-jdbc-0.3.2.jar your_script.py
2. 修正JDBC配置错误
- 代码2中重复设置了
driver选项,删除其中一个避免配置冲突; - ClickHouse的JDBC URL已指定数据库(
esia_dev),dbtable无需重复写库名,改为直接写表名bill_agg_test。
修正后的代码示例:
df.write \ .format("jdbc") \ .mode("append") \ .option("driver", "ru.yandex.clickhouse.ClickHouseDriver") \ .option("url", "jdbc:clickhouse://adqm2.gu.local:8123/esia_dev")\ .option("dbtable", "bill_agg_test")\ .option("user", "user") \ .option("password", "password")\ .save()
3. 校验数据类型与表结构匹配
确保DataFrame字段类型和ClickHouse目标表完全兼容:
- Spark
StringType→ ClickHouseString - Spark
LongType→ ClickHouseInt64 - 避免使用ClickHouse不支持的类型(如Spark复杂类型对应ClickHouse未定义的字段类型)
4. 检查网络与权限
确认Spark集群能访问ClickHouse的8123端口,同时使用的账号拥有esia_dev.bill_agg_test表的写入权限。
内容的提问来源于stack exchange,提问作者Марсель Абдуллин
相关产品推荐
相关产品推荐

