【问题标题】:Create hive table with partitions from a Scala dataframe使用 Scala 数据帧中的分区创建配置单元表
【发布时间】:2021-02-12 23:39:24
【问题描述】:

我需要一种从 Scala 数据框创建配置单元表的方法。 Hive 表应该在 S3 位置具有 ORC 格式的基础文件,按日期分区。

这是我目前得到的:

我将 scala 数据帧以 ORC 格式写入 S3

df.write.format("orc").partitionBy("date").save("S3Location)

我可以在 S3 位置看到 ORC 文件。 我现在在这些 ORC 文件的顶部创建一个配置单元表:

CREATE EXTERNAL TABLE "tableName"(columnName string)
PARTITIONED BY (date string)
STORED AS ORC
LOCATION "S3Location"
TBLPROPERTIES("orc.compress"="SNAPPY")

但是蜂巢表是空的,即 spark.sql("select * from db.tableName") 不打印任何结果。

但是,当我删除 PARTITIONED BY 行时:

CREATE EXTERNAL TABLE "tableName"(columnName string, date string)
STORED AS ORC
LOCATION "S3Location"
TBLPROPERTIES("orc.compress"="SNAPPY")

我看到了选择查询的结果。

hive 似乎无法识别 spark 创建的分区。我正在使用 Spark 2.2.0。

任何建议将不胜感激。

更新:

我从一个 spark 数据框开始,我只需要一种方法来在其顶部创建一个配置单元表(基础文件在 S3 位置为 ORC 格式)。

【问题讨论】:

    标签: scala apache-spark hive apache-spark-sql hiveql


    【解决方案1】:

    我认为分区还没有添加到配置单元元存储中,所以你只需要运行这个配置单元命令:

    MSCK REPAIR TABLE table_name
    

    如果不起作用,可能需要检查以下几点:

    • 将数据写入s3后,文件夹应为:s3://anypathyouwant/mytablefolder/transaction_date=2020-10-30
    • 创建外部表时,位置应指向s3://anypathyouwant/mytablefolder

    是的,Spark 将数据写入 s3,但不会将分区定义添加到 hive 元存储中!除非它们位于可识别的分区下,否则 hive 不知道写入的数据。 因此,要检查 hive 元存储中有哪些分区,您可以使用此 hive 命令:

    SHOW PARTITIONS tablename
    

    在生产环境中,我不建议为此使用MSCK REPAIR TABLE,因为这会浪费太多时间。最好的方法是让你的代码通过rest api只将新创建的分区添加到你的元存储中。

    【讨论】:

    • 谢谢,msck repair 命令使它工作,但我不确定生产中的性能。我们如何在代码中向 Metastore 添加分区(您提到的最佳方式)?请注意,我有一个要写入 s3 的数据框,并且需要从中创建配置单元表。
    • @ic10503 你的元存储是什么? aws胶水?你在使用 Hcatalog 还是类似的东西?
    • 我认为它是 Hive 元存储/火花仓库。不知道你问的是不是这个。
    • @ic10503 在您的 aws 控制台中,在 aws 胶水下,您能看到您的表定义吗?
    • 嗯,这个想法是将其余查询发送到您的元存储,因此您需要在您使用的元存储的文档中找到方法!
    猜你喜欢
    • 1970-01-01
    • 2017-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多