查询同一张表时,spark sql 返回空值,但配置单元和 impaly 获取正常数据?

Posted

技术标签:

【中文标题】查询同一张表时,spark sql 返回空值,但配置单元和 impaly 获取正常数据?【英文标题】:when querying the same table ,spark sql return null values but hive and impaly get nomal data? 【发布时间】:2019-01-09 08:04:39 【问题描述】:

我在蜂巢中有一张桌子

查询同一张表有两种方式:

    hive 或 impala:我得到了这样的预期结果
0: jdbc:hive2://cdh-master3:10000/> SELECT * FROM kafka_table.risk_order_user_level_info rouli WHERE rouli.month = '2019_01' AND rouli.day = '08' androuli.order_id >0 limit 5;
INFO  : OK
+-----------------+-------------------+------------+--------------+---------------+-------------------+-----------------------+---------------+---------------------+----------------------+-------------------+--------------+------------+--+
| rouli.order_id  | rouli.order_type  | rouli.uid  | rouli.po_id  | rouli.status  | rouli.user_level  | rouli.pre_user_level  | rouli.credit  | rouli.down_payment  | rouli.open_order_id  | rouli.createtime  | rouli.month  | rouli.day  |
+-----------------+-------------------+------------+--------------+---------------+-------------------+-----------------------+---------------+---------------------+----------------------+-------------------+--------------+------------+--+
| 39180235        | 2                 | 10526665   | -999         | 100           | 10                | 106                   | 27000         | 0              | -999                 | 1546887803138     | 2019_01      | 08         |
| 39180235        | 2                 | 10526665   | -999         | 100           | 10                | 106                   | 27000         | 0              | -999                 | 1546887805302     | 2019_01      | 08         |
| 39180235        | 2                 | 10526665   | -999         | 100           | 10                | 106                   | 27000         | 0              | -999                 | 1546887807457     | 2019_01      | 08         |
| 39180235        | 2                 | 10526665   | -999         | 100           | 10                | 106                   | 27000         | 0              | -999                 | 1546887809610     | 2019_01      | 08         |
| 39804907        | 2                 | 15022908   | -999         | 100           | -999              | -999                  | 0             | 85000              | -999                 | 1546887807461     | 2019_01      | 08         |
+-----------------+-------------------+------------+--------------+---------------+-------------------+-----------------------+---------------+---------------------+----------------------+-------------------+--------------+------------+--+
    但是 usr spark whate python 或 scala ,我知道了,有几个列是空的
scala> spark.sql("SELECT * FROM kafka_table.risk_order_user_level_info WHERE month = '2019_01' AND day = '08'  limit 5").show()
+--------+----------+--------+-----+------+----------+--------------+-------+------------+-------------+-------------+-------+---+
|order_id|order_type|     uid|po_id|status|user_level|pre_user_level| credit|down_payment|open_order_id|   createTime|  month|day|
+--------+----------+--------+-----+------+----------+--------------+-------+------------+-------------+-------------+-------+---+
|    null|      null|14057428| null|    90|      null|          null|2705000|        null|         null|1546920940672|2019_01| 08|
|    null|      null| 5833953| null|    90|      null|          null|2197000|        null|         null|1546920941872|2019_01| 08|
|    null|      null|10408291| null|   100|      null|          null|1386000|        null|         null|1546920941979|2019_01| 08|
|    null|      null|  621761| null|   100|      null|          null| 100000|        null|         null|1546920942282|2019_01| 08|
|    null|      null|10408291| null|   100|      null|          null|1386000|        null|         null|1546920942480|2019_01| 08|
+--------+----------+--------+-----+------+----------+--------------+-------+------------+-------------+-------------+-------+---+

如何让 sparksql 返回预期结果???

ps: 我在 spark 和 hive 中执行流动的 sql 发现不同的结果;

SELECT * FROM kafka_table.risk_order_user_level_info rouli
WHERE rouli.month = '2019_01' AND rouli.day = '08'
and order_id IN (
 39906526,
 39870975,
 39832606,
 39889240,
 39836630
)

two results

这是发布此页面的问题的地方;

我也用上面两种方法检查表的记录数,计数是一样的

【问题讨论】:

你能不能试着选择特定的行,然后看看它是否有数据。就像选择 where order_id=39180235 一样。因为我看到你的两个输出包含不同的 uid 3KQ回复,已更新问题 【参考方案1】:

在您的 spark sql 查询中也包含 rouli.order_id >0 条件。您将在 spark sql 输出中看到非空记录。

注意:Limit 会随机返回记录。以上两种场景显示的结果属于不同的order_ids。

【讨论】:

【参考方案2】:

我自己解决了。 此表中的数据是sparksql编写的,但是scala(spark)中的字段名称与hive不同(创建表sql)。

例如:orderID (scala) 但 order_id (sql)

【讨论】:

以上是关于查询同一张表时,spark sql 返回空值,但配置单元和 impaly 获取正常数据?的主要内容,如果未能解决你的问题,请参考以下文章

更新表时如何改进 Spark 中的 SQL 查询? (子查询中的'NOT IN')

OpenJPA/MySQL:在 where 子句中使用同一张表时修改表

如何根据同一张表中的其他列匹配替换空值

如何写sql语句去掉oracle返回结果中的空值(NULL)

Oracle两张表关联中间表查询,那张关联到数据就显示,关联不到就负空值

SQL 语句连接