为啥在火花中运行时配置单元查询不起作用

Posted

技术标签:

【中文标题】为啥在火花中运行时配置单元查询不起作用【英文标题】:Why doesn't hive query work when run in spark为什么在火花中运行时配置单元查询不起作用 【发布时间】:2019-09-02 03:56:14 【问题描述】:

我开发了一个 hive 查询,它使用横向视图和 get_json_object 来解压一些 json。该查询使用 jdbc 客户端 (dbvisualizer) 运行良好,但是当从 java 应用程序作为 spark sql 运行时,在相同的数据上,它什么也不返回。

如果我创建一个数组来模拟预期的解压 json,则查询有效

array('Plan A','Plan B','Plan C','Plan D')

但是如果我用这个语句解包它不会:

split(regexp_replace(get_json_object('"product_offer":["productName":"Plan A","productName":"Plan B","productName":"Plan C","productName":"Plan D"]', '$.product_offer.productName'), '\\[|\\]|"', ''), ',' )

在 dbvisualizer 中单独运行时,它们产生相同的输出,并且在比较时是等效的。

这是查询的精简版本,适用于具有一行的测试表,为 java 转义:

 "SELECT pageid , exp.* , exp2.* , exp3.* from stephen \n" +
   "lateral view outer posexplode( split(regexp_replace(get_json_object('\"product_offer\":[\"productName\":\"P lan A\",\"productName\":\"Plan B\",\"productName\":\"Plan C\",\"productName\":\"Plan D\"]', '$.product_offer.productName'), '\\\\[|\\\\]|\"', ''), ',' ) )  exp as seqn, product_name\n" +
 "lateral view outer posexplode( array('aaaa','bbb','ccc','ddd'))  exp2 as seqo, product_offer\n" +
 "lateral view outer posexplode( array('Delete','Add','Add','Delete'))  exp3 as seqa, product_action\n" +
 "where (seqn=seqo)\n" +
 "  and (seqn=seqa)\n" 

我使用的是 java 8,hive 版本'2.2.0 rda840b0f8fa99cab9f004810cd22abc207493cae'

没有记录错误。

【问题讨论】:

【参考方案1】:

当我确定 get_json_object 行为不端时,我将问题改写为enter link description here:用于获取所有产品名称的正确路径是

'$.product_offer[*].productName'

【讨论】:

以上是关于为啥在火花中运行时配置单元查询不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 CLI 中运行时,Jest 测试不起作用

在 github 操作中运行时 mv 命令不起作用

在物理设备中运行时,Flutter 中的热重载不起作用

为啥这个简单的动画在 iOS 7 上不起作用?

当图像在 docker 机器中运行时,X11 转发不起作用,但如果图像在没有 docker 机器的情况下运行,则它可以正常工作

子查询中的子查询在配置单元中不起作用