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的主要内容,如果未能解决你的问题,请参考以下文章

Oozie Spark (2.x) 动作总是卡在接受状态

Spark2.x读Hbase1-2.x

如何在 Apache-Spark 2.x 中使用 java 进行增量序列

Spark 2.x saveAsTable

如何在现有的 Hadoop 2.x 中使用 spark

spark 2.x 正在使用 csv 函数将整数/双列作为字符串读取