【问题标题】:Using spark sql DataFrameWriter to create external Hive table使用 spark sql DataFrameWriter 创建外部 Hive 表
【发布时间】:2017-09-01 22:41:51
【问题描述】:

作为我正在处理的数据集成过程的一部分,我需要将 Spark SQL DataFrame 持久化为外部 Hive 表。

我目前的限制:

  • 目前仅限于 Spark 1.6 (v1.6.0)
  • 需要将数据持久化到特定位置,即使删除表定义(因此外部表)也保留数据

我找到了一个令人满意的解决方案来编写数据帧df,如下所示:

df.write.saveAsTable('schema.table_name',
    format='parquet',
    mode='overwrite',
    path='/path/to/external/table/files/')       

对结果表执行describe extended schema.table_name 确认它确实是外部的。即使表本身被删除,我也可以确认数据被保留(根据需要)。

我主要担心的是,我在任何地方都找不到这方面的文档示例,我在官方文档中也找不到太多提及 - 特别是使用path 来强制创建外部表。 (https://spark.apache.org/docs/1.6.0/api/python/pyspark.sql.html#pyspark.sql.DataFrameWriter)。

是否有更好/更安全/更标准的方式来持久化数据帧?

【问题讨论】:

    标签: apache-spark hive spark-dataframe pyspark-sql


    【解决方案1】:

    我宁愿自己创建 Hive 表(例如 CREATE EXTERNAL TABLE IF NOT EXISTS),然后在 Spark 中执行以下操作:df.write.saveAsTable('schema.table_name', mode='overwrite')。

    这样您就可以控制表的创建,而不必依赖 HiveContext 来完成您需要的工作。过去,以这种方式创建的 Hive 表存在问题,并且由于该 API 是通用的,并且无法保证 HiveContext 的底层实现,因此行为在未来可能会发生变化。

    【讨论】:

    • 感谢您的回答贡萨洛。需要明确的是,您是否建议我使用 Hive create 语句专门在所需位置创建表,然后将架构创建留给 saveAsTable 命令?或者我在 Hive 语句中包含尽可能多的表定义?
    • 我总是在 CREATE 中进行完整的表定义,如果表已经存在,我希望(但没有尝试过)保存参数被忽略
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-09
    • 1970-01-01
    相关资源
    最近更新 更多