Spark 2.x saveAsTable
Posted
技术标签:
【中文标题】Spark 2.x saveAsTable【英文标题】: 【发布时间】:2017-12-15 17:13:31 【问题描述】:我正在尝试使用 Spark 2.1.0 java api 将 DataFrame(行数据集)持久化为 Hive 表。我尝试在DataFrameWriter
类中使用saveAsTable
方法。
我的代码如下:df.write(appendMode).saveAsTable("tablename");
我收到AnalysisException
说明
org.apache.spark.sql.AnalysisException:在我的 Hive serde 中保存数据 表还不支持。请使用
insertInto()
API 作为 替代
我真的不能使用saveAsTable
方法吗?它没有在 api 文档中标记为已弃用。
【问题讨论】:
你的表已经存在了吗? 是的。我正在尝试追加到预先存在的表 您的表格格式是什么?它是否解决了您的问题,在保存期间指定格式?例如,如果是镶木地板 df.write(appendMode).format("parquet")。 saveAsTable("表名"); 指定表格格式并不能解决我的问题 【参考方案1】:例外是因为,您尝试在其中附加数据的表“tablename”是使用"Hive serde"
创建的,这意味着表tablename
中的数据将存储为文本文件。
您正在使用saveAsTable
Api,它使用org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe
serde 以parquet
格式写入数据。所以 spark api,不能用文本附加 parquet 数据,这就是异常的原因。
解决方案:不要预先创建表,让“saveAsTable
”Api 自己创建表,并使用它第一次需要的数据框和属性的模式,然后继续在其中附加数据。
如果您需要自己创建表格,则需要确保表格存储为 parquet 并使用适当的 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\":]'
)
【讨论】:
以上是关于Spark 2.x saveAsTable的主要内容,如果未能解决你的问题,请参考以下文章