Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 使用通配符读取物理分区的数据_Apache Spark_Amazon S3_Pyspark_Apache Spark Sql - Fatal编程技术网

Apache spark 使用通配符读取物理分区的数据

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 =

我在AWS S3上有一个具有以下结构的持久化数据帧:

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
to
SparkSession.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)
)