pyspark 使用分区列时,通过使用Polybase T-SQL将数据从Parquet文件复制到Azure Synapse中的表失败

wvmv3b1j  于 2022-11-01  发布在  Spark
关注(0)|答案(1)|浏览(125)

我尝试使用Polybase T-SQL将 parquet 文件复制到Azure Synapse中的表。

data = [["Jean", 15, "Tennis"], ["Jane", 20, "Yoga"], ["Linda", 35, "Yoga"], ["Linda", 35, "Tennis"]]
columns = ["Name", "Age", "Sport"]
df = spark.createDataFrame(data, columns)

然后,我通过按列“Sport”进行分区,将 Dataframe 保存为 parquet 文件:

df\
.write\
.option("header", True)\
.partitionBy("Sport")\
.format("parquet")\
.mode("overwrite")\
.save("/mnt/test_partition_polybase.parquet")

然后,我使用Polybase T-SQL将parquet文件复制到Synapse中的表:

IF OBJECT_ID(N'EVENTSTORE.TEST') IS NOT NULL BEGIN DROP EXTERNAL TABLE EVENTSTORE.TEST END 
CREATE EXTERNAL TABLE EVENTSTORE.TEST(
    [Name] NVARCHAR(250),
    [Age] BIGINT,     
    [SPORT] NVARCHAR(250)
    )
 WITH (DATA_SOURCE = [my_data_source],LOCATION = N'test_partition_polybase.parquet',FILE_FORMAT = [SynapseParquetFormat],REJECT_TYPE = VALUE,REJECT_VALUE = 0)

我得到的错误:
由于内部错误,外部文件访问失败:'文件测试_分区_聚合物基. parquet /运动=网球/部件-00000-tid-5109481329839379912- 631 db 0ad-cd 52 - 4f 9 e-acf 6 - 76828 a8 aa 4 eb-67- 1.c000.snappy. parquet :HdfsBridge::CreateRecordReader -创建记录读取器时遇到意外错误:Hadoop执行异常:列计数不匹配。源文件有2列,外部表定义有3列
这是因为分区文件中没有分区列“Sport”,如何解决?

xtfmy6hx

xtfmy6hx1#

最后,我通过创建一个重复列解决了这个问题:

df\
.withColumn("part_Sport", F.col("Sport"))\
.write\
.option("header", True)\
.partitionBy("part_Sport")\
.format("parquet")\
.mode("overwrite")\
.save("/mnt/test_partition_polybase.parquet")

我不知道这是否是最好的解决办法,但这是我找到的唯一一个。

相关问题