将镶木地板文件读入数据框时如何指定文件夹结构的模式
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
函数的输入值基于您拥有的确切文件夹结构。
希望能解决你的问题。
我必须读取存储在以下文件夹结构中的镶木地板文件 /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
函数的输入值基于您拥有的确切文件夹结构。
希望能解决你的问题。