Hive Spark 2.x saveAsTable

Hive Spark 2.x saveAsTable,hive,apache-spark-2.0,Hive,Apache Spark 2.0,我试图使用Spark 2.1.0 java api将数据帧(行数据集)持久化为配置单元表。我尝试在DataFrameWriter类中使用saveAsTable方法 我的代码看起来像:df.write(appendMode).saveAsTable(“tablename”) 我得到一个AnalysisException声明 org.apache.spark.sql.AnalysisException:在我的配置单元serde中保存数据 表还不受支持。请使用insertInto()API作为 另类

我试图使用Spark 2.1.0 java api将数据帧(行数据集)持久化为配置单元表。我尝试在
DataFrameWriter
类中使用
saveAsTable
方法

我的代码看起来像:
df.write(appendMode).saveAsTable(“tablename”)

我得到一个
AnalysisException
声明

org.apache.spark.sql.AnalysisException:在我的配置单元serde中保存数据 表还不受支持。请使用
insertInto()
API作为 另类


我真的不能使用
saveAsTable
方法吗?api文档中未将其标记为已弃用。

例外情况是,您试图在其中附加数据的表“tablename”是使用
“Hive serde”
创建的,这意味着表
tablename
中的数据将存储为文本文件

同样,您使用的是
saveAsTable
Api,它使用
org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe
serde以
parquet
格式写入数据。所以spark api不能用文本附加拼花地板数据,这就是为什么会出现异常

解决方案:不要预先创建表,让“
saveAsTable
”Api使用它第一次需要的数据帧和属性的模式创建表本身,然后继续在其中添加数据

如果您需要自己创建桌子,则需要确保桌子存储为拼花地板,并具有适当的
tblproperty
。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\":{}}]}'
  )

你的桌子已经存在了吗?是的。我正在尝试向预先存在的表追加什么是表格式?它是否解决了您的问题?请在保存过程中指定格式?例如,如果它是parquet df.write(appendMode).format(“parquet”)。保存表(“表名”);指定表格格式并不能解决我的问题