我需要获得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中:
- 比Spark= 3.2.3
- δSpark= 2.0.0
在数据块中:
- DBR 11.3低强度
- Spark = 3.3.0(我只是注意到这一点不同,我将测试3.3.0是否在本地工作)
- 比例尺= 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
1条答案
按热度按时间5n0oy7gb1#
如果你使用Python,那么与其执行难以解析的SQL命令,不如使用Python API。
DeltaTable
示例有一个detail
函数,它返回一个包含表(doc)详细信息的 Dataframe ,这个 Dataframe 有一个partitionColumns
列,它是一个包含分区列名的字符串数组。