SparkSQL 第一次爆炸后第二次爆炸
SparkSQL second explode after the first explode
我正在使用以下命令在第一次爆炸后进行第二次爆炸:
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
在第一个之后。您只是选择了部分数据。 Explode 获取一行并基于该行创建更多行。这正是您的第一次爆炸所做的,这是正确的。对于第二次和后续转换,您不是在创建新行——而是在创建新列。您可以使用 withColumn
或使用 select
.
创建一个新列
在您的例子中,您正试图获取 StructType
中的嵌套数据。要访问 StructType
中的各个字段,您可以使用 getField
。类似于:
`df.withColumn("newColumn", $"name_x".getField("fieldName"))
您必须弄清楚要使用什么 fieldName
-- 如果您不确定,只需在 DataFrame
上使用 printSchema
并取一个峰值。
我正在使用以下命令在第一次爆炸后进行第二次爆炸:
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
在第一个之后。您只是选择了部分数据。 Explode 获取一行并基于该行创建更多行。这正是您的第一次爆炸所做的,这是正确的。对于第二次和后续转换,您不是在创建新行——而是在创建新列。您可以使用 withColumn
或使用 select
.
在您的例子中,您正试图获取 StructType
中的嵌套数据。要访问 StructType
中的各个字段,您可以使用 getField
。类似于:
`df.withColumn("newColumn", $"name_x".getField("fieldName"))
您必须弄清楚要使用什么 fieldName
-- 如果您不确定,只需在 DataFrame
上使用 printSchema
并取一个峰值。