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这似乎已经导致广播连接。