Spark SQL通用File Source选项


这些通用选项/配置仅在使用基于文件的源时有效:parquet、orc、avro、json、csv、text。请注意,以下示例中使用的目录层次结构如下:

dir1/
 ├── dir2/
 │    └── file2.parquet (schema: <file: string>, content: "file2.parquet")
 └── file1.parquet (schema: <file, string>, content: "file1.parquet")
 └── file3.json (schema: <file, string>, content: "{'file':'corrupt.json'}")

一、忽略损坏的文件

Spark允许您使用配置spark.sql.files.ignoreCorruptFiles或数据源选项ignoreCorruptFiles在从文件中读取数据时忽略损坏的文件。当设置为true时,当遇到损坏的文件时,Spark作业将继续运行,并且已读取的内容仍将返回。
要在读取数据文件时忽略损坏的文件,可以使用:

# enable ignore corrupt files via the data source option
# dir1/file3.json is corrupt from parquet's view
test_corrupt_df0 = spark.read.option("ignoreCorruptFiles", "true")\
    .parquet("examples/src/main/resources/dir1/",
             "examples/src/main/resources/dir1/dir2/")
test_corrupt_df0.show()
# +-------------+
# |         file|
# +-------------+
# |file1.parquet|
# |file2.parquet|
# +-------------+

# enable ignore corrupt files via the configuration
spark.sql("set spark.sql.files.ignoreCorruptFiles=true")
# dir1/file3.json is corrupt from parquet's view
test_corrupt_df1 = spark.read.parquet("examples/src/main/resources/dir1/",
                                      "examples/src/main/resources/dir1/dir2/")
test_corrupt_df1.show()
# +-------------+
# |         file|
# +-------------+
# |file1.parquet|
# |file2.parquet|
# +-------------+

Spark repo中的“examples/src/main/python/sql/datasource.py”中找到完整的示例代码。

二、忽略丢失的文件

Spark允许你使用配置spark.sql.files.ignoreMissingFiles或数据源选项ignoreMissingFiles在从文件读取数据时忽略丢失的文件。这里,丢失的文件实际上是指在构造DataFrame后目录下删除的文件。当设置为true时,Spark作业将在遇到丢失的文件时继续运行,并且仍然会返回已读取的内容。

三、路径Glob过滤器

pathGlobFilter用于只包含文件名与pattern匹配的文件。语法如下org.apache.hadoop.fs.GlobFilter。它不会改变分区发现的行为。要加载具有匹配给定glob pattern的路径的文件,同时保持分区发现的行为,你可以使用:

df = spark.read.load("examples/src/main/resources/dir1",
                     format="parquet", pathGlobFilter="*.parquet")
df.show()
# +-------------+
# |         file|
# +-------------+
# |file1.parquet|
# +-------------+

四、递归(Recursive)文件查找

recursiveFileLookup用于递归加载文件,并禁用分区推断。其默认值为false。若数据源在recursiveFileLookup为true时显式指定了partitionSpec,则将引发异常。
要递归加载所有文件,可以使用:

recursive_loaded_df = spark.read.format("parquet")\
    .option("recursiveFileLookup", "true")\
    .load("examples/src/main/resources/dir1")
recursive_loaded_df.show()
# +-------------+
# |         file|
# +-------------+
# |file1.parquet|
# |file2.parquet|
# +-------------+

五、修改Time Path过滤器

modifiedBefore和modifiedAfter是可以一起应用或单独应用的选项,以便在Spark批处理查询期间实现更大的文件加载粒度。(请注意,Structured Streaming文件源不支持这些选项。)

  • modifiedBefore:一个可选的时间戳,仅包括修改时间在指定时间之前的文件。提供的时间戳必须采用以下格式:YYYY-MM-DDTHH:mm:ss(例如2020-06-01T13:00:00)
  • modifiedAfter:一个可选的时间戳,仅包括修改时间在指定时间之后的文件。提供的时间戳必须采用以下格式:YYYY-MM-DDTHH:mm:ss(例如2020-06-01T13:00:00)

如果没有提供时区选项,时间戳将根据Spark会话时区(spark.sql.session.timeZone)进行解释。
要加载路径与给定修改时间范围匹配的文件,可以使用:

# Only load files modified before 07/1/2050 @ 08:30:00
df = spark.read.load("examples/src/main/resources/dir1",
                     format="parquet", modifiedBefore="2050-07-01T08:30:00")
df.show()
# +-------------+
# |         file|
# +-------------+
# |file1.parquet|
# +-------------+
# Only load files modified after 06/01/2050 @ 08:30:00
df = spark.read.load("examples/src/main/resources/dir1",
                     format="parquet", modifiedAfter="2050-06-01T08:30:00")
df.show()
# +-------------+
# |         file|
# +-------------+
# +-------------+

Spark repo中的“examples/src/main/python/sql/datasource.py”中找到完整的示例代码。

  • 27
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值