我正在尝试使用Spark 2.1.0 java api将DataFrame(行数据集)作为Hive表持久化。我尝试在saveAsTable
类中使用DataFrameWriter
方法。
我的代码如下:df.write(appendMode).saveAsTable("tablename");
我得到AnalysisException
说明
org.apache.spark.sql.AnalysisException:在我的Hive serde中保存数据 表尚不支持。请使用
insertInto()
API作为 备选
我真的不能使用saveAsTable
方法吗?它在api文档中未标记为已弃用。
答案 0 :(得分:2)
异常是因为,您尝试附加数据的表“tablename”是使用"Hive serde"
创建的,这意味着表tablename
中的数据将存储为文本文件
正如您所使用的saveAsTable
Api,它使用parquet
serde以org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe
格式写入数据。因此,火花api,不能附加带有文本的镶木地板数据,这就是例外的原因。
解决方案:不要事先创建表,让“saveAsTable
”Api首次使用数据框架和第一次需要的属性模式创建表格,然后继续在其中附加数据。
如果您需要自己创建表格,则需要确保将表格存储为镶木地板并使用适当的TBLPROPERTIES
。例如如下:
CREATE TABLE `savetest`(
`channel` string,
`address` string,
`curr_date` string)
ROW FORMAT SERDE
'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
TBLPROPERTIES (
'COLUMN_STATS_ACCURATE'='false',
'numFiles'='2',
'numRows'='-1',
'rawDataSize'='-1',
'spark.sql.sources.provider'='parquet',
'spark.sql.sources.schema.numParts'='1',
'spark.sql.sources.schema.part.0'='{\"type\":\"struct\",\"fields\":[{\"name\":\"channel\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}},{\"name\":\"address\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}},{\"name\":\"curr_date\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}}]}'
)