PySpark将Parquet数据Overwrite写入Impala表时出现语法错误
解决方案:PySpark写入Impala Overwrite模式字段带引号报错
问题原因
使用overwrite模式时,Spark会自动生成建表SQL,给字段名添加双引号(如"app_id"),但Impala默认不支持带双引号的标识符语法,导致解析报错;而append模式无需重建表,因此不会触发该问题。
解决方法
方法1:修改Spark配置禁用字段名引号
初始化SparkSession时添加配置,让Spark生成建表语句时不给字段名加引号:
from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("Write to Impala") \ .config("spark.sql.quotedColumnNames", "false") \ .getOrCreate() read_data = spark.read.parquet("file.parquet") read_data.write.mode('overwrite')\ .option("driver", "com.cloudera.impala.jdbc4.Driver")\ .jdbc("jdbc:impala:*parameters of db*", "table")
方法2:手动预先创建Impala表
先在Impala中手动创建与Parquet文件字段、类型匹配的目标表,Spark的overwrite模式会直接覆盖数据,不再重新生成建表语句:
-- 在Impala客户端执行建表语句 CREATE TABLE sbx_001.eliza1 ( app_id DECIMAL(15,0), -- 补充其他字段及对应类型 ) STORED AS PARQUET;
之后执行原Spark写入代码即可。
方法3:使用HiveContext写入(适配旧版Spark)
若使用Spark 2.x之前的版本,可尝试用HiveContext替代普通SQLContext,规避引号生成问题:
from pyspark.sql import HiveContext from pyspark import SparkContext sc = SparkContext() hive_context = HiveContext(sc) read_data = hive_context.read.parquet("file.parquet") read_data.write.mode('overwrite').saveAsTable("sbx_001.eliza1")
内容的提问来源于stack exchange,提问作者Eliza
相关产品推荐
相关产品推荐

