gpt4 book ai didi

apache-spark - SparkSQL : Can I explode two different variables in the same query?

转载 作者:行者123 更新时间:2023-12-04 04:54:51 26 4
gpt4 key购买 nike

我有以下爆炸查询,它工作正常:

data1 = sqlContext.sql("select explode(names) as name from data")

我想分解另一个字段“颜色”,因此最终输出可能是名称和颜色的笛卡尔积。所以我做了:
data1 = sqlContext.sql("select explode(names) as name, explode(colors) as color from data")

但我得到了错误:
 Only one generator allowed per select but Generate and and Explode found.;

有谁有想法吗?

我实际上可以通过执行两个步骤来使其工作:
   data1 = sqlContext.sql("select explode(names) as name from data")
data1.registerTempTable('data1')
data1 = sqlContext.sql("select explode(colors) as color from data1")

但我想知道是否可以一步完成?非常感谢!

最佳答案

正确的语法是

select name, color 
from data
lateral view explode(names) exploded_names as name
lateral view explode(colors) exploded_colors as color
Rashid 的回答不起作用的原因是它没有“命名” LATERAL VIEW 生成的表。 .
解释
这样想: LATERAL VIEW就像一个隐含的 JOINstructs 中的每一行创建一个临时表在正在“查看”的集合中。所以,解析语法的方法是:
LATERAL VIEW table_generation_function(collection_column) table_name AS col1, ...
多个输出列
如果使用 posexplode()等表格生成函数那么你仍然有一个输出表,但有多个输出列:
LATERAL VIEW posexplode(orders) exploded_orders AS order_number, order
嵌套
您还可以“嵌套” LATERAL VIEW通过反复分解嵌套集合,例如,
LATERAL VIEW posexplode(orders) exploded_orders AS order_number, order
LATERAL VIEW posexplode(order.items) exploded_items AS item_number, item
性能注意事项
当我们谈论 LATERAL VIEW的话题时需要注意的是,通过 SparkSQL 使用它比通过 DataFrame 使用它更有效。 DSL,例如, myDF.explode() .原因是 SQL 可以准确地推理模式,而 DSL API 必须在语言类型和数据帧行之间执行类型转换。 DSL API 在性能方面的损失,然而,它获得了灵活性,因为您可以从 explode 返回任何支持的类型,这意味着您可以一步执行更复杂的转换。
更新
在最新版本的 Spark 中,行级爆炸通过 df.explode()通过 df.select(..., explode(...).as(...)) 不推荐使用列级爆炸.还有一个 explode_outer() , 即使要分解的输入是 null 也会产生输出行.列级爆炸不会受到上述行级爆炸的性能问题的影响,因为 Spark 可以完全使用内部行数据表示来执行转换。

关于apache-spark - SparkSQL : Can I explode two different variables in the same query?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36876959/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com