【问题标题】:How to stack several 1 x 1 dataframes to get a 1 x n dataframe?如何堆叠几个 1 x 1 数据帧以获得 1 x n 数据帧?
【发布时间】:2019-05-04 09:32:04
【问题描述】:

我有一个包含数百万行的巨大数据框。从这些行中,我得到了新的 k 数据框,它只有 1 行和 1 列。 将这些 k 数据帧连接在一起以便现在获得一个具有 1 行和 k 列的数据帧 1 x k 的好方法是什么。

  1. 过去,我开始在所有 k 数据帧中使用 crossJoin,例如 df1.crossJoin(df2).crossJoin(df3).crossJoin(dfk)

    这导致了广播超时错误,

  2. 后来我转向了我认为更智能的解决方案。

    df1.withColumn("temp_id", lit(0)).join(df2.withColumn("temp_id", lit(0)), "temp_id").drop("temp_id").

    这导致了一个奇怪但类似的广播超时错误。

我真正想要的结果是一个新的 DataFrame,它有 1 行和 k 列,在 numpy/pandas 语言中可能是

pandas.concat(..., axis=1) 或者 np.vstack(.....)

【问题讨论】:

  • pd.concat 是我的猜测,但没有任何数据很难确定最佳方法。
  • 请记住,pandas 和 spark 的主要区别在于最后一个是分布式系统,您提到的错误可能是大洗牌的结果。请提供如下所示的完整描述:stackoverflow.com/questions/48427185/…

标签: apache-spark pyspark apache-spark-sql databricks


【解决方案1】:

我认为您要执行的操作是“zip”操作。 Spark 没有为 Dataframes 提供此方法,但您可以通过以下示例了解它的工作原理(Spark 版本遵循此示例):

scala> val l1 = List("a", "b")
l1: List[String] = List(a, b)

scala> val l2 = List(1,2)
l2: List[Int] = List(1, 2)

scala> val zipped = l1.zip(l2)
zipped: List[(String, Int)] = List((a,1), (b,2))

scala> zipped.foreach(println)
(a,1)
(b,2)

scala> 

如何在 Spark 中执行此操作已在此处得到解答: How to zip two (or more) DataFrame in Spark

基本上,你这样做:

val zippedRDD = df1.rdd.zip(df2.rdd)

这将为您留下一个 RDD,您可以根据需要以通常的方式将其转换为 DF 或 DS。

【讨论】:

  • @praateek 如果这对您有所帮助,您能否接受答案(点击答案旁边的灰色复选标记)并投票?谢谢。
猜你喜欢
  • 2020-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-20
  • 1970-01-01
相关资源
最近更新 更多