Apache spark 使用通配符读取物理分区的数据
我在AWS S3上有一个具有以下结构的持久化数据帧:Apache spark 使用通配符读取物理分区的数据,apache-spark,amazon-s3,pyspark,apache-spark-sql,Apache Spark,Amazon S3,Pyspark,Apache Spark Sql,我在AWS S3上有一个具有以下结构的持久化数据帧: s3://bucket/df/ |__ date=2020-02-19/ |__ FILENAME01.json |__ FILENAME02.json |__ FILENAME03 |__ ... |__ date=2020-02-20/ |__ FILENAME04.json |__ FILENAME05 |__ ... |__ ... 如果我使用以下语法读取此数据帧: df =
s3://bucket/df/
|__ date=2020-02-19/
|__ FILENAME01.json
|__ FILENAME02.json
|__ FILENAME03
|__ ...
|__ date=2020-02-20/
|__ FILENAME04.json
|__ FILENAME05
|__ ...
|__ ...
如果我使用以下语法读取此数据帧:
df = spark.read.json("s3://bucket/df)"
没有扩展名的文件将成为我的数据帧的一部分,这是不可取的。所以,我只想考虑文件<>代码> JSON<代码>扩展.< /P>
所以我决定阅读这个数据帧,用后缀*.json
过滤文件。在实践中,我尝试了以下方法:
df = spark.read.json("s3://bucket/df/date=*/*.json")
spark.read.json
有效,但用于划分数据帧的列date
不存在。有没有办法只检索与分区文件夹中特定后缀匹配的文件,而不丢失分区列?Spark只能在给定的输入路径下查找分区。但是在这里,您的路径已经包含分区date
。您可以从以下网址阅读:
从Spark 1.6.0开始,分区发现只查找分区
默认情况下,在给定路径下。对于上面的示例,如果用户通过
path/to/table/gender=male
toSparkSession.read.parquet
或
SparkSession.read.load
,性别将不被视为
分区列。如果用户需要指定
分区发现应该从开始,他们可以在
数据源选项。例如,当path/to/table/gender=male
为
数据的路径和用户将basePath设置为path/to/table/
,性别
将是一个分区列
您可以指定basePath
选项:
df = spark.read.option("basePath", "s3://bucket/df/").json("s3://bucket/df/date=*/*.json")
或者,您也可以使用regexp\u extract
函数从input\u file\u name
提取date
分区:
from pyspark.sql import functions as F
df = df.withColumn(
"date",
F.regexp_extract(F.input_file_name(), r".*/date=(\d{4}-\d{2}-\d{2})/.*", 1)
)