将镶木地板文件读入数据框时如何指定文件夹结构的模式

How to specify schema for the folder structure when reading parquet file into a dataframe

我必须读取存储在以下文件夹结构中的镶木地板文件 /yyyy/mm/dd/(例如:2021/01/31)

如果我这样阅读文件,它会起作用:

unPartitionedDF = spark.read.option("mergeSchema", "true").parquet("abfss://xxx@abc.dfs.core.windows.net/Address/*/*/*/*.parquet")

不幸的是,文件夹结构没有以典型的分区格式存储 /yyyy=2021/mm=01/dd=31/ 而且我没有奢侈将其转换为该格式。

我想知道是否有一种方法可以向 Spark 提供有关文件夹结构的提示,以便它可以在我的数据框中将“2021/01/31”作为 yyyy、mm、dd 提供。

我有另一组文件,它们以 /yyyy=aaaa/mm=bb/dd=cc 格式存储,下面的代码有效:

partitionedDF = spark.read.option("mergeSchema", "true").parquet("abfss://xxx@abc.dfs.core.windows.net/Address/")

我尝试过的东西

我已经指定了模式,但它只返回空值

customSchema = StructType([
  StructField("yyyy",LongType(),True),
  StructField("mm",LongType(),True),
  StructField("dd",LongType(),True),
  StructField("id",LongType(),True),
  StructField("a",LongType(),True),
  StructField("b",LongType(),True),
  StructField("c",TimestampType(),True)])

partitionDF = spark.read.option("mergeSchema", "true").schema(customSchema).parquet("abfss://xxx@abc.dfs.core.windows.net/Address/")
display(partitionDF)

以上returns无数据!。如果我将路径更改为:“abfss://xxx@abc.dfs.core.windows.net/Address////。 parquet”,然后我得到数据,但是 yyyy,mm,dd 列是空的。

另一种选择是将文件夹路径加载为一列,但我似乎找不到这样做的方法。

TIA

Databricks N00B!

我建议你加载没有你提到的分区文件夹的数据

unPartitionedDF = spark.read.option("mergeSchema", "true").parquet("abfss://xxx@abc.dfs.core.windows.net/Address/*/*/*/*.parquet")

然后在

中添加一个具有input_file_name函数值的列
import pyspark.sql.functions as F
unPartitionedDF = unPartitionedDF.withColumn('file_path', F.input_file_name())

然后您可以将新 file_path 列的值拆分为三个单独的列。

df = unPartitionedDF.withColumn('year',  F.split(df['file_path'], '/').getItem(3)) \
                    .withColumn('month', F.split(df['file_path'], '/').getItem(4)) \
                    .withColumn('day',   F.split(df['file_path'], '/').getItem(5))

getItem 函数的输入值基于您拥有的确切文件夹结构。

希望能解决你的问题。