【发布时间】:2017-09-12 12:29:07
【问题描述】:
我尝试了多种方法来解决以下问题:
Gender, Age, Value
1, 20, 21
2, 23 22
1, 26, 23
2, 29, 24
进入
Male_Age, Male_Value, Female_Age, Female_Value
20 21 23 22
26 23 29 24
我需要做的是按性别分组,而不是使用像(sum、count、avg)这样的聚合,我需要创建 List[age] 和 List[value]。这应该是可能的,因为我使用的是允许功能操作的数据集。
如果男性和女性的行数不一样,列应该填nulls。
我尝试的一种方法是使用其他数据框的列创建一个新的新数据框,如下所示:
df .select(male.select("sex").where('sex === 1).col("sex"),
female.select("sex").where('sex === 2).col("sex"))
但是,这会奇怪地产生如下输出:
sex, sex, 1, 1 2, 2 1, 1 2, 2
我看不出这怎么可能。
我也尝试过使用数据透视,但它迫使我在分组后聚合:
df.withColumn("sex2", df.col("sex"))
.groupBy("性")
.pivot("sex2") .agg( sum('value').as("mean"),
stddev('value).as("std.dev") ) .show()
|sex| 1.0_mean| 1.0_std. dev| 2.0_mean| 2.0_std. dev|
|1.0|0.4926065526| 1.8110632697| | |
|2.0| | |0.951250372|1.75060275400785|
以下代码可以满足我在 Oracle SQL 中的需要,因此我认为在 Spark SQL 中也应该可以实现...
drop table mytable CREATE TABLE mytable ( gender number(10) NOT NULL, age number(10) NOT NULL, value number(10) ); insert into mytable values (1,20,21); insert into mytable values(2,23,22); insert into mytable values (1,26,23); insert into mytable values (2,29,24); insert into mytable values (1,30,25); select * from mytable; SELECT A.VALUE AS MALE, B.VALUE AS FEMALE FROM (select value, rownum RN from mytable where gender = 1) A FULL OUTER JOIN (select value, rownum RN from mytable where gender = 2) B ON A.RN = B.RN
【问题讨论】:
标签: scala apache-spark apache-spark-sql