首页 > 解决方案 > 从多个 parquet 路径创建 Spark SQL 表

问题描述

我使用数据块。我正在尝试创建如下表

`       target_table_name = 'test_table_1'
        spark.sql("""
          drop table if exists %s
          """ % target_table_name)

        spark.sql("""
          create table if not exists {0}
          USING org.apache.spark.sql.parquet
          OPTIONS (
          path ("/mnt/sparktables/ds=*/name=xyz/")
          )
          """.format(target_table_name))

尽管使用“*”让我可以灵活地加载不同的文件(模式匹配)并最终创建一个表,但我希望基于两个完全不同的路径创建一个表(没有模式匹配)。

path1 = /mnt/sparktables/ds=*/name=xyz/ path2 = /mnt/sparktables/new_path/name=123fo/

标签: apache-sparkpysparkapache-spark-sqlhdfsdatabricks

解决方案


Spark 使用 Hive 元存储来创建这些永久表。这些表本质上是 Hive 中的外部表。

通常,您尝试的操作是不可能的,因为 Hive 外部表位置在创建时需要是唯一的。

但是,如果您在 hive 元存储上合并分区策略,您仍然可以实现具有不同位置的 hive 表。

在 hive 元存储中,您可以拥有指向不同位置的分区。

然而,没有现成的方法来实现这一点。首先,您需要为数据集指定一个分区键,并从整个数据属于一个分区的第一个位置创建一个表。然后alter table 添加一个新分区。

样本:

create external table tableName(<schema>) partitioned by ('name') location '/mnt/sparktables/ds=*/name=xyz/'

然后你可以添加分区

alter table tableName add partition(name='123fo') location '/mnt/sparktables/new_path/name=123fo/'

此过程的替代方法是从 2 个位置创建 2 个数据框,然后将它们组合起来saveAsaTable


推荐阅读