【问题标题】:How to reliably obtain partition columns of delta table如何可靠地获取delta表的分区列
【发布时间】:2023-01-24 21:50:05
【问题描述】:

我需要获取delta表的分区列,但是返回的结果是 DESCRIBE delta.`my_table` 在数据块上和 PyCharm 本地返回不同的结果。

最小的例子:

from pyspark.sql.types import StructType, StructField, StringType, IntegerType

delta_table_path = "c:/temp_delta_table"
partition_column = ["rs_nr"]

schema = StructType([
        StructField("rs_nr", StringType(), False),
        StructField("event_category", StringType(), True),
        StructField("event_counter", IntegerType(), True)])

data = [{'rs_nr': '001', 'event_category': 'event_01', 'event_counter': 1},
 {'rs_nr': '002', 'event_category': 'event_02', 'event_counter': 2},
 {'rs_nr': '003', 'event_category': 'event_03', 'event_counter': 3},
 {'rs_nr': '004', 'event_category': 'event_04', 'event_counter': 4}]

sdf = spark.createDataFrame(data=data, schema=schema)

sdf.write.format("delta").mode("overwrite").partitionBy(partition_column).save(delta_table_path)

df_descr = spark.sql(f"DESCRIBE delta.`{delta_table_path}`")

df_descr.toPandas()

在数据块上显示分区列:

    col_name                data_type     comment
0   rs_nr                      string        None
1   event_category             string        None
2   event_counter                 int        None
3   # Partition Information
4   # col_name              data_type     comment
5   rs_nr                      string        None

但是在 PyCharm 中本地运行时,我得到以下不同的输出:

         col_name data_type comment
0           rs_nr    string        
1  event_category    string        
2   event_counter       int        
3                                  
4  # Partitioning                  
5          Part 0     rs_nr        

解析这两种类型的返回值对我来说似乎很难看,所以这样返回是有原因的吗?

设置:

在 Pycharm 中:

  • pyspark = 3.2.3
  • 三角洲火花 = 2.0.0

在数据块中:

  • DBR 11.3 LTS
  • Spark = 3.3.0(我只是注意到这有所不同,同时我会测试 3.3.0 是否在本地工作)
  • Scala = 2.12

在 PyCharm 中,我使用以下方法创建连接:

def get_spark():
    spark = SparkSession.builder.appName('schema_checker')\
        .config("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension")\
        .config("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog")\
        .config("spark.jars.packages", "io.delta:delta-core_2.12:2.0.0")\
        .config("spark.sql.catalogImplementation", "in-memory")\
        .getOrCreate()

    return spark

【问题讨论】:

    标签: apache-spark pycharm databricks delta-lake


    【解决方案1】:

    如果您使用的是 Python,那么与其执行难以解析的 SQL 命令,不如使用 Python API。 DeltaTable 实例有一个 detail 函数,它返回一个数据框,其中包含关于表的详细信息 (doc),并且这个数据框有一个 partitionColumns 列,它是带有分区列名称的字符串数组。所以你可以这样做:

    from delta.tables import *
    
    detailDF = DeltaTable.forPath(spark, delta_table_path).detail()
    partitions = detailDF.select("partitionColumns").collect()[0][0]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-05
      • 2022-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-06
      • 1970-01-01
      相关资源
      最近更新 更多