从多个镶木地板路径创建Spark SQL表

时间:2018-05-30 23:52:34

标签: apache-spark pyspark apache-spark-sql hdfs databricks

我使用数据库。我正在尝试创建一个表格,如下所示

`       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 /

2 个答案:

答案 0 :(得分:1)

Spark使用Hive Metastore来创建这些永久表。这些表基本上是Hive中的外部表。

一般来说,您尝试的是不可能的,因为Hive外部表位置在创建时需要是唯一的。

但是,如果在hive Metastore中加入分区策略,仍然可以获得具有不同位置的hive表。

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

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

样品:

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

答案 1 :(得分:-1)

您可以为两个或多个镶木地板文件单独创建数据框,然后将它们合并(假设它们具有相同的模式)

df1.union(df2)