查询同一张表时,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)