SparkSQL在第一次爆炸后第二次爆炸

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SparkSQL在第一次爆炸后第二次爆炸相关的知识,希望对你有一定的参考价值。

我在第一次爆炸后使用以下命令进行第二次爆炸:

myExplode = sqlContext.sql("select explode(names) as name_x from myTable")
myExplode = sqlContext.sql("select explode(name_x) as name1 from myTable")
myExplode.show(6,False)

然后我得到了错误:u"cannot resolve 'name_x' given input columns: [names, fieldA, fieldB, fieldC]; line 1 pos 15"

然而,第一次爆炸工作正常。在我的第二次爆炸中,我做错了什么吗?


这是一个例子:

+---------------------------------------------------------------------------------+
|names                                                                            |
+---------------------------------------------------------------------------------+
|[[[Max,White,WrappedArray(SanDiego)],3], [[Spot,Black,WrappedArray(SanDiego)],2]]|
|[[[Michael,Black,WrappedArray(SanJose)],1]]                                      |
+---------------------------------------------------------------------------------+

在第一次爆炸后,我得到了:

+-----------------------------------------+
|name_x                                   |
+-----------------------------------------+
|[[Max,Black],3]                          |
|[[Spot,White],2]                         |
|[[Michael,Yellow],1]                     |
+-----------------------------------------+

我现在想在name_x上进行第二次爆炸,所以我可以得到[Max,Black],[Spot,White]和[Michael,Yellow]。在此之后,我甚至想要进行第三次爆炸,因此我只能获得Max,Spot和Michael,并将它们放入新的专栏中。这可能吗?

谢谢!

答案

在第一个之后你不想要explodes。您只是选择部分数据。爆炸占用一行,并根据该行创建更多行。这正是你的第一次爆炸所做的,这是正确的。对于第二次和后续转换,您不是在创建新行 - 您正在创建新列。您可以使用withColumn或使用select创建新列。

在您的情况下,您正试图在StructType中获取嵌套数据。要访问StructType中的各个字段,请使用getField。就像是:

`df.withColumn("newColumn", $"name_x".getField("fieldName"))

你将不得不弄清楚使用什么fieldName - 如果你不确定,只需在你的printSchema上使用DataFrame并取得一个高峰。

以上是关于SparkSQL在第一次爆炸后第二次爆炸的主要内容,如果未能解决你的问题,请参考以下文章

Spark 结构化流/Spark SQL 中的条件爆炸

Excel文件第一次双击打不开,退出后第二次双击就能打开。

CDQZ集训DAY9 日记

UWP中实现大爆炸效果

iOS Facebook 帐户工具包 - 成功登录后第二次打开应用程序时保留用户令牌

如何爆炸结构数组?