spark 2.x saveastable

pepwfjgg  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(508)

我正在尝试使用spark2.1.0javaapi将Dataframe(行数据集)持久化为配置单元表。我试着用 saveAsTable 中的方法 DataFrameWriter 班级。
我的代码看起来像: df.write(appendMode).saveAsTable("tablename"); 我收到一封信 AnalysisException 声明
org.apache.spark.sql.analysis分析exception:saving data 在我的配置单元中,还不支持serde表。请使用 insertInto() api作为替代方案
我真的不能用这个吗 saveAsTable 方法?api文档中没有将其标记为已弃用。

csga3l58

csga3l581#

异常是因为,您试图在其中附加数据的表“tablename”是用 "Hive serde" ,也就是说,表中的数据 tablename 将存储为文本文件。
因为,您正在使用 saveAsTable api,它将数据写入 parquet 使用 org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe 塞德。所以spark api不能用文本附加Parquet数据,这就是为什么会出现异常。
解决方法:不要预先创建表,让 saveAsTable “api使用它第一次需要的Dataframe和属性的架构创建表本身,然后继续在其中添加数据。
如果您需要自己创建table,那么您需要确保table存储为Parquet地板,并且具有适当的 TBLPROPERTIES . e、 g如下:

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\":{}}]}'
  )

相关问题