【问题标题】:Functional way of joining multiple dataframes连接多个数据框的功能方式
【发布时间】:2019-03-29 10:42:45
【问题描述】:

由于严重的 Python 滥用,我正在学习 Scala 中的 Spark,我得到了 java.lang.NullPointerException,因为我正在以 Python 的方式做事。

我说 3 个形状为 4x2 的数据帧,第一列始终是索引 0,1,2,3,第二列是一些二进制特征。最终目标是拥有一个 4x4 数据框,其中包含所有单个数据框的连接。在 python 中,我会首先定义一些主 df,然后遍历中间的,在每个循环中将生成的连接数据帧分配给主数据帧变量名称(丑陋):

dataframes = [temp1, temp2, temp3]
df = pd.DataFrame(index=[0,1,2,3]) # Master df
for temp in dataframes:
    df = df.join(temp)

在 Spark 中这不能很好地发挥作用: q = "select * from table" val df = sql(q) 明显有效

scala> val df = df.join(sql(q))
<console>:33: error: recursive value df needs type
       val df = df.join(sql(q))

好的:

scala> val df:org.apache.spark.sql.DataFrame = df.join(sql(q))
java.lang.NullPointerException
  ... 50 elided

我认为我很可能没有以实用的方式进行操作。所以我尝试了(最丑!):

scala> :paste
// Entering paste mode (ctrl-D to finish)

    sql(q).
      join(sql(q), "device_id").
      join(sql(q), "device_id").
      join(sql(q), "device_id")

    // Exiting paste mode, now interpreting.

    res128: org.apache.spark.sql.DataFrame = [device_id: string, devtype: int ... 3 more fields]

这只是看起来丑陋、不雅和初学者。实现此目的的适当功能 Scala 方法是什么?

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    foldLeft:

    val dataframes: Seq[String] = ???
    val df: Dataset[Row] = ???
    
    dataframes.foldLeft(df)((acc, q) => acc.join(sql(q)))
    

    如果您正在寻找 Python 代码的命令式等效项:

    var dataframes: Seq[String] = ???  // IMPORTANT: var
    for (q <- dataframes ) { df = df.join(sql(q)) }
    

    【讨论】:

      【解决方案2】:

      更简单,

      val dataframes: Seq[String] = ???
      dataframes.reduce(_ join _)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-03
        • 2020-11-20
        • 2019-10-14
        • 1970-01-01
        • 2017-10-18
        • 2021-09-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多