Spark 2.x saveAsTable

问题描述 投票:1回答:1

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

hive apache-spark-2.0
1个回答
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\":{}}]}'
  )
© www.soinside.com 2019 - 2024. All rights reserved.