【问题标题】:Spark SQL query issue - SQL with Subquery doesn't seem to retrieve recordsSpark SQL 查询问题 - 带有子查询的 SQL 似乎无法检索记录
【发布时间】:2020-07-11 03:21:27
【问题描述】:

我有一个 Spark SQL 查询,例如:

Select * from xTable a Where Exist (filter subquery) AND (a.date IN (Select max(b.date) from xTable b))

在某些情况下(当没有提供过滤表时),我的filter subquery 应该简单地做一个Select 1

每当我在 Impala 中运行它时,它都会返回记录,在 Hive 中它抱怨只允许 1 个子查询表达式。但是,当我在 Spark 2.4 中将它作为 Spark SQL 运行时,它返回一个空数据帧。知道为什么吗?我做错了什么?

【问题讨论】:

  • 你能澄清一下我的filter subquery应该简单地做一个选择1。是吗?
  • 是的,如果没有提供过滤表,它只需要做一个“选择1”,但是如果提供了一个过滤表,那么从过滤表中选择*。
  • 由于查询本身看起来不错,这意味着没有足够的信息来找出问题所在。能否添加explain() 输出,并检查执行器日志是否有任何异常)?
  • 另外,我会将a.date IN (Select max(b.date) from xTable b) 更改为a.date = (Select max(b.date) from xTable b),因为它的join vs. filter。

标签: apache-spark apache-spark-sql


【解决方案1】:

好的,我想我找到了原因。它与查询无关。尝试在 Hive 中使用 csv 文件创建表时,这似乎是一个问题。

当您选择源时 - HDFS 中 csv 文件的路径 ,然后在格式下 - 选中“有标题”复选框。

好像创建表没问题。

然后,当我在 Hive 或 Impala 中执行以下操作时:

Select max(date) from xTable

我得到了最大日期(日期列是字符串)

但是,当我尝试通过 Spark SQL 运行相同的程序时:

我得到的结果是date(与列标题同名)。

如果我从 CSV 文件中删除标题并将其导入,然后他们手动创建标题和类型,那么我不会遇到这个问题。

看起来像是某种形式的错误,或者可能是我的用户错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多