提问者:小点点

如何在Azure Delta湖上创建外部表(类似于Hive)


如何在 Azure 数据湖存储上创建外部增量表?我目前正在从事一个迁移项目(从Pyspark/Hadoop到Azure)。我找不到有关在 Azure Delta take 中创建非托管表的太多文档。以下是我目前能够在 Pyspark/Hive/HDFS 设置中执行的一系列操作,想知道如何在 Azure 上建立相同的操作。

按顺序操作-

  1. 创建数据框DF
  2. 删除Hive外部表(如果存在),使用将数据框DF加载到此外部表DF.write.insert("table")
  3. 创建数据框DF1
  4. 删除Hive外部表(如果存在),使用将数据框DF1加载到此外部表DF1.write.insert(table)

即使我在加载第二个数据框之前执行“删除表(如果存在)”,如果我在第4步之后查询“表”,我也可以看到两个数据框中的内容,因为我只是“删除”表结构,而不是实际数据(Hive外部表)。这是它的外观-

>>> df = spark.createDataFrame([('abcd','xyz')], ['s', 'd'])
>>> df1 = spark.createDataFrame([('abcd1','xyz1')], ['s', 'd'])
>>> spark.sql("CREATE EXTERNAL TABLE IF NOT EXISTS mydb.test_table (s string,d string) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' LOCATION 'hdfs://system/dev/stage/test_table'")
>>> df.write.insertInto("mydb.test_table",overwrite=True)
>>> spark.sql('DROP TABLE IF EXISTS mydb.test_table')
>>> df1.write.insertInto("mydb.test_table",overwrite=False)
>>> spark.sql("select * from mydb.test_table").show()
+-----+----+
|    s|   d|
+-----+----+
|abcd1|xyz1|
| abcd| xyz|
+-----+----+

我正在尝试使用Azure Delta湖表执行类似操作,步骤如下-

  1. 创建数据框。
  2. 在ADLS中保存数据帧(可能这就是我在这里做错的,我应该使用挂载dbfs路径而不是容器吗?)
  3. 在此路径之上创建非托管表。

这是我的数据库笔记本中的代码。

df = spark.createDataFrame([('abcd','xyz')], ['s', 'd'])
table_path = f"abfss://mycontainer@xxxxxxxxxxxx.dfs.core.windows.net/stage/test_table"
df.write.format("delta").mode("overwrite").option("path",table_path)
spark.sql("CREATE TABLE test_table USING DELTA LOCATION 'abfss://mycontainer@xxxxxxxxxxxx.dfs.core.windows.net/stage/test_table'")

但是,它没有将数据帧写入位置table_path并且最后一步无法创建表(可能需要dbfs:此处需要挂载路径?如何使用非托管的 Delta 湖表执行类似的操作?


共1个答案

匿名用户

CREATE EXTERNAL TABLE IF NOT EXISTS my_table (name STRING, age INT)
  COMMENT 'This table is created with existing data'
  LOCATION 'spark-warehouse/tables/my_existing_table'

使用上述方法在Delta Lake中像Hive一样创建外部表。

有关完整参考,请查看以下网络文档链接 https://learn.microsoft.com/en-us/azure/databricks/spark/2.x/spark-sql/language-manual/create-table

CREATE TABLE [IF NOT EXISTS] [db_name.]table_name
  [(col_name1 col_type1 [COMMENT col_comment1], ...)]
  USING data_source
  [OPTIONS (key1 [ = ] val1, key2 [ = ] val2, ...)]
  [PARTITIONED BY (col_name1, col_name2, ...)]
  [CLUSTERED BY (col_name3, col_name4, ...) INTO num_buckets BUCKETS]
  [LOCATION path]
  [COMMENT table_comment]
  [TBLPROPERTIES (key1 [ = ] val1, key2 [ = ] val2, ...)]
  [AS select_statement]

[位置路径]有助于提供外部路径。此子句将负责外部表的创建