代码之家  ›  专栏  ›  技术社区  ›  JFlo

在PySpark笔记本中读取多个Parquet文件

  •  0
  • JFlo  · 技术社区  · 5 月前

    当将多个拼花文件读入数据帧时,它似乎会在之后对每个拼花文件进行评估,以便进行后续转换,而此时它应该对数据帧进行评估。

    我正在使用pyspark在一个织物笔记本内工作。我试图将多个拼花文件读入一个数据帧中。每个拼花文件的列数相同,但列模式可能不同,例如,一个名为“adjustment”的列可能是int类型,但如果留空,则键入string。我目前正在将文件读入我的数据帧

    df = spark.read.schema(schema).parquet(*files).withColumn(
        "file_name", split(input_file_name(), "/").getItem(8)
    )
    

    在这里,我指定了一个模式,文件是我想从湖中加载的文件的文件路径列表。File_name只是其中包含日期的文件的名称。

    当我奔跑时

    display(df.where(col("file_name").contains("2024-10-01")))
    

    它似乎很好地显示了数据帧,类似于display(df),但当我运行时

    display(df.where(col("file_name").contains("2024-12-01")))
    

    它给了我这个错误

    org.apache.spark.SparkException: Parquet column cannot be converted in file abfss://[email protected]/lakehouse/path/to/my/data/Data_2024-12-01. Column: [data.adjustment], Expected: string, Found: INT64.
    

    我曾尝试指定模式,我曾尝试.cache()或.persist()数据帧,但每次都会出现此错误。我认为这与懒惰的评估有关,但我只是想不出除了分别读取每个拼花文件,然后在对每一列执行模式更改后对其进行联合之外还能做什么。提前感谢您的帮助

    1 回复  |  直到 5 月前
        1
  •  1
  •   David Browne - Microsoft    5 月前

    但我只是想不出除了分别读取每个拼花文件,然后在对每一列执行模式更改后将其合并之外,还能做什么

    对。这就是你要做的。在一个语句中读取多个拼花文件只有在模式匹配的情况下才有效。

    因此,在python中循环这些文件,将每个文件读入一个DataFrame,添加转换以使模式匹配,然后将它们合并到最终的DataFrame中。