Spark 2.x saveAsTable

时间:2017-12-15 17:13:31

标签: hive apache-spark-2.0

我正在尝试使用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文档中未标记为已弃用。

1 个答案:

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