Spark SQL(六)之加载数据的参数配置

该博客详细介绍了在Spark中如何配置读取数据时的多种策略,包括忽略损坏和丢失的文件、使用路径全局过滤器、进行递归文件查找以及应用修改时间路径过滤器。通过设置相关选项,可以更灵活地控制数据读取过程,确保数据的完整性和正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、配置

忽略损坏的文件、忽略丢失的文件、路径全局过滤器、递归文件查找和修改时间路径过滤器等选项/配置仅在使用基于文件的源(parquet,orc,avro,json,csv,txt)时才有效。

以下示例中使用的目录层次结构为:

dir/
 ├── childDir/
 │    └── test.json
 └── test.avro
 └── test.orc
 └── test1.json

 

二、忽略损坏的文件

设置spark.sql.files.ignoreCorruptFiles为true从文件读取数据时忽略损坏的文件。

读取数据文件时忽略损坏的文件例子:

spark.sql("set spark.sql.files.ignoreCorruptFiles=true");
// dir/test.avro 和 dir/test.avro不是json被忽略
Dataset<Row> jsonDF = spark.read().json(
        "hdfs://master:9000/dir/",
        "hdfs://master:9000/dir/chidDir/");
jsonDF.show();

 

三、忽略丢失的文件

设置spark.sql.files.ignoreMissingFiles设置为true在文件读取数据时忽略不存在的文件。

spark.sql("set spark.sql.files.ignoreMissingFiles=true");

Dataset<Row> jsonDF = spark.read().json(
        "hdfs://master:9000/dir/",
        "hdfs://master:9000/dir/chidDir/a.json");
jsonDF.show();

 

四、路径全局过滤器

pathGlobFilter用于仅包含文件名与模式匹配的文件。语法实现为org.apache.hadoop.fs.GlobFilter类,它不会更改分区发现的行为。

要加载具有与给定全局模式匹配的路径的文件,同时保持分区发现的行为,例子:

Dataset<Row> jsonDF = spark.read().format("json")
        .option("pathGlobFilter", "*.json") // dir只读取json文件
        .load("hdfs://master:9000/dir");
jsonDF.show();

 

五、递归文件查找

recursiveFileLookup用于递归加载文件,并且禁用分区推断。其默认值为false。如果数据源显式指定partitionSpec并且recursiveFileLookup为true,则将引发异常。

递归加载所有文件例子:

Dataset<Row> jsonDF = spark.read().format("json")
        .option("recursiveFileLookup", "true")
        .load("hdfs://master:9000/dir");
jsonDF.show();

 

六、修改时间路径过滤器

modifiedBefore和·modifiedAfter是可以一起应用或单独应用的选项。(注意,结构化流文件源不支持这些选项。)

  • modifiedBefore:可选的时间戳记,仅包含修改时间在指定时间之前发生的文件。提供的时间戳必须采用以下格式:YYYY-MM-DDTHH:mm:ss(例如:2021-03-31T20:10:00)
  • modifiedAfter:可选的时间戳记,仅包括修改时间在指定时间之后发生的文件。提供的时间戳必须采用以下格式:YYYY-MM-DDTHH:mm:ss(例如:2021-03-31T20:10:00)

如果未提供时区选项,则时间戳使用Spark会话时区(spark.sql.session.timeZone)。

要加载路径与给定的修改时间范围匹配的文件,例子:

Dataset<Row> jsonDF = spark.read().format("json")
        .option("modifiedBefore", "2021-03-21T11:34:00")
        .option("modifiedAfter", "2021-03-05T11:34:00")
        // Interpret both times above relative to CST timezone
        .option("timeZone", "CST")
        .load("hdfs://master:9000/dir");
jsonDF.show();

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值