我开发了一个配置单元查询,该查询使用侧面视图和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'
没有记录错误。
答案 0 :(得分:0)
当我发现get_json_object行为异常时,将问题改写为enter link description here:用于获取所有产品名称的正确路径是
'$.product_offer[*].productName'