java - Spark 数据帧过滤 ("where") 子句的自定义解释

标签 java scala apache-spark apache-spark-sql

我有一个系统,将数据存储在 s3 上的 parquet 数据集中。每个数据集包含单个日历日期的数据。

我希望能够以纯 SQL 术语查询单个日期、一组日期或一系列日期。 但我不需要获取所有数据集来丢弃其中的大部分数据,而是想拦截查询解释并根据日期相关子句进行明显的优化。

如何自定义 Spark DataFrame/Dataest 查询解释?例如select * from X where day = '2018-06-16' 应该仅获取 /datasets/X/2018-06-16 中的数据集。同样的问题也适用于使用数据帧 DSL,而不是真正附加到使用 SQL。

第三方连接器(例如 Cassandra)必须对查询 AST 进行相同类型的拦截。如果太困惑,使用 UDF 是一个可行的起点吗?

我未能找到相关文档,但可能是由于搜索了错误的术语

最佳答案

如果您能够将 s3 目录从 /datasets/X/2018-06-16 更改为 /datasets/X/dt=2018-06-16。然后创建这样的数据集

val ds = spark.read.parquet("/datasets/X")

您可以轻松查询

ds.where("dt = '2018-06-16'")

ds.where("dt >= '2018-06-10' and dt <= '2018-06-16'")

它只读取您在 where 子句条件中提到的特定日期

关于java - Spark 数据帧过滤 ("where") 子句的自定义解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50887322/

相关文章:

scala - Scala可传递隐式转换

scala - 尝试将 Spark DF 写入 Hive 表时出现错误 "Invalid call to qualifier on unresolved object"

apache-spark - Apache Spark/Azure Data Lake Storage - 仅处理一次文件,将文件标记为已处理

python - 如何在 Spark 数据框中添加具有序列值的列?

java - 将内容放入 Map<?,?> 或将 Map<String,String> 转换为 Map<?,?>

java - RecyclerView 显示为空

java - 使用 char 而不是 String 来结束 do while 循环。这是可能的? java

scala - scala中是否有一些扩展版本的unzip,它可用于任何List [n-tuple]而不是像Unzip这样的List [pairs]?

apache-spark - 是否有可能实现一个支持非平稳关机的可靠接收器?

java - 在 Web 应用程序中使用 weblogic 数据源选项