将 spark DataFrame 写入表

Posted

技术标签:

【中文标题】将 spark DataFrame 写入表【英文标题】:Write a spark DataFrame to a table 【发布时间】:2020-12-22 07:27:26 【问题描述】:

我正在尝试理解名为 saveAsTable 的 spark DataFrame API 方法。

我有以下问题

如果我只是使用 saveAsTable API 编写一个数据帧 df7.write.saveAsTable("t1"),(假设 t1 之前不存在),新创建的表是否会是一个 hive 表,可以使用 Hive QL 在 spark 外部读取? spark 是否还会创建一些非 Hive 表(使用 saveAsTable API 创建但无法使用 HiveQL 在 spark 外部读取)? 如何检查一个表是 Hive 表还是非 Hive 表?

(我是大数据处理的新手,如果问题表述不当,请见谅)

【问题讨论】:

【参考方案1】:

是的。新创建的表将是 hive 表,可以从 Hive CLI 查询(仅当 DataFrame 是从单个输入 HDFS 路径创建的,即从非分区的单个输入 HDFS 路径创建时)。

以下是DataFrameWriter.scala 类中的文档注释。 Documentation link

当 DataFrame 从非分区创建时 HadoopFsRelation 具有单个输入路径,以及数据源 provider 可以映射到现有的 Hive 内置 SerDe(即 ORC 和 Parquet),表以 Hive 兼容的格式保存,这 意味着其他系统(如 Hive)将能够读取此表。 否则,表将以 Spark SQL 特定格式保存。

【讨论】:

【参考方案2】:

是的,你可以做到。您的表可以按列分区,但不能使用分桶(这是 spark 和 hive 之间的问题)。

【讨论】:

以上是关于将 spark DataFrame 写入表的主要内容,如果未能解决你的问题,请参考以下文章

Spark - 如何将约 20TB 的数据从 DataFrame 写入配置单元表或 hdfs?

将 Spark Dataframe 写入 HDP2.6 中的 Hive 可访问表

Spark操作dataFrame进行写入mysql,自定义sql的方式

将 Spark DataFrame 写入 Hive 表时的内存分配问题

使用 pySpark 将 DataFrame 写入 mysql 表

将写入操作映射到 Dataframe 行组到不同的增量表