Join Spark SQL concat柱
在对一个数据帧执行了多个列的操作之后,我想“连接/连接”原始帧上的所有结果。 在Join Spark SQL concat柱,join,apache-spark,apache-spark-sql,Join,Apache Spark,Apache Spark Sql,在对一个数据帧执行了多个列的操作之后,我想“连接/连接”原始帧上的所有结果。 在pandas中,这可以通过索引pd.concat(axis=1)实现。我应该如何将其移植到spark? 如果不要求将所有列都列为联接列,那就太好了 val input = Seq( (0, "A", "B", "C", "D"), (1, "A", "B", "C", "D"), (0, "d", "a", "jkl", "d"), (0, "d", "g", "C", "D"),
pandas
中,这可以通过索引pd.concat(axis=1)
实现。我应该如何将其移植到spark?
如果不要求将所有列都列为联接列,那就太好了
val input = Seq(
(0, "A", "B", "C", "D"),
(1, "A", "B", "C", "D"),
(0, "d", "a", "jkl", "d"),
(0, "d", "g", "C", "D"),
(1, "A", "d", "t", "k"),
(1, "d", "c", "C", "D"),
(1, "c", "B", "C", "D")
).toDF("TARGET", "col1", "col2", "col3TooMany", "col4")
一个定义如下的计算
def handlePercentage(col:String, df: DataFrame, inputToDrop: Seq[String] = inputToDrop,
inputToBias: Seq[String] = inputToBias, target:String = "TARGET"): DataFrame = {
val pre1_1 = df.groupBy(col).agg(mean(target).alias("pre_" + col))
val pre2_1 = df.groupBy(col, target).agg(count("*") / df.filter(df(target) === 1).count alias ("pre2_" + col))
df.join(pre1_1, Seq(col)).join(pre2_1, Seq(col, target))
}
函数调用的输出如下所示
handlePercentage("col1", input).join(handlePercentage("col2", input), Seq("col1", "col2", "TARGET ", "col3TooMany", "col4")).show
+----+----+----------+-----------+----+------------------+---------+------------------+---------+
|col1|col2|TARGET |col3TooMany|col4| pre_col1|pre2_col1| pre_col2|pre2_col2|
+----+----+----------+-----------+----+------------------+---------+------------------+---------+
| A| B| 0| C| D|0.6666666666666666| 0.25|0.6666666666666666| 0.25|
| c| B| 1| C| D| 1.0| 0.25|0.6666666666666666| 0.5|
| A| d| 1| t| k|0.6666666666666666| 0.5| 1.0| 0.25|
| d| c| 1| C| D|0.3333333333333333| 0.25| 1.0| 0.25|
| d| a| 0| jkl| d|0.3333333333333333| 0.5| 0.0| 0.25|
| d| g| 0| C| D|0.3333333333333333| 0.5| 0.0| 0.25|
| A| B| 1| C| D|0.6666666666666666| 0.5|0.6666666666666666| 0.5|
+----+----+----------+-----------+----+------------------+---------+------------------+---------+
当我加入大约40列时,这个操作相当慢。如何将它们与索引连接起来?或者以不同的方式更快地执行此操作?我相信我的join(使用了很多属性)相当慢。
这是一个类似的问题,但是列是预先计算的,整个模式是合并的,而我只想获得当前列
我注意到spark倾向于在垃圾收集中浪费大量时间。鉴于您在计算中正在进行聚合,我假设数据大小会显著减小。您可以对这些结果进行广播,然后使用查找UDF添加这些值。这不会超过几GB,然后加入真正的大数据。这会带来一些改进吗?我试图缓存我的数据帧,但这并没有起到任何作用。@LiMuBei使用spark sql这似乎主要导致广播连接。鉴于您正在计算中进行聚合,我假设数据大小会明显变小。您可以对这些结果进行广播,然后使用查找UDF添加这些值。这不会超过几GB,然后加入真正的大数据。这会带来一些改进吗?我试图缓存我的数据帧,但这没有帮助。@LiMuBei使用spark sql这似乎已经导致广播连接。