【问题标题】:How to combine several Dataframes together in scala?如何在scala中将几个Dataframes组合在一起?
【发布时间】:2018-07-13 12:27:14
【问题描述】:

我有几个数据框,其中包含单列。假设我有 4 个这样的数据框都只有一列。如何通过组合所有数据框来形成单个数据框?

val df = xmldf.select(col("UserData.UserValue._valueRef"))
val df2 = xmldf.select(col("UserData.UserValue._title"))
val df3 = xmldf.select(col("author"))
val df4 = xmldf.select(col("price"))

要结合,我正在尝试这个,但它不起作用:

var newdf = df
newdf = newdf.withColumn("col1",df1.col("UserData.UserValue._title"))
newdf.show()

错误地说一列的字段不存在于另一列中。我不确定如何将这 4 个数据帧组合在一起。它们没有任何共同的列。

df2 看起来像这样:

+---------------+
|         _title|
+---------------+
|_CONFIG_CONTEXT|
|_CONFIG_CONTEXT|
|_CONFIG_CONTEXT|
+---------------+

df 看起来像这样:

+-----------+
|_valuegiven|
+-----------+
|        qwe|
|     dfdfrt|
|       dfdf|
+-----------+

df3 和 df4 也是相同的格式。我想要像下面的数据框:

+-----------+---------------+
|_valuegiven|         _title|
+-----------+---------------+
|        qwe|_CONFIG_CONTEXT|
|     dfdfrt|_CONFIG_CONTEXT|
|       dfdf|_CONFIG_CONTEXT|
+-----------+---------------+

我用过这个:

val newdf = xmldf.select(col("UserData.UserValue._valuegiven"),col("UserData.UserValue._title") )
newdf.show()

但是我在旅途中获取列名,因此,我需要在旅途中追加,因此我不知道我将获得多少列。这就是为什么我不能使用上面的命令。

【问题讨论】:

  • 在这种情况下,您可以加载所有数据,然后选择所需的列。如果您需要添加列,只需重新选择您想要的列。那么你就不需要使用多个join,也不需要考虑行顺序不固定。

标签: scala apache-spark dataframe


【解决方案1】:

你的目标有点不清楚。如果要求加入这些数据框,但也许您只想选择这 4 列。

val newdf = xmldf.select($"UserData.UserValue._valueRef", $"UserData.UserValue._title", 'author,'price")
newdf.show

如果您真的想加入所有这些数据框,则需要将它们全部加入并选择适当的字段。

【讨论】:

  • 如果你想要特定的列名,请使用select($"UserData.UserValue._valueRef" as "newname", ...
  • 我更新了我的问题中确切需要的内容。我不能使用val newdf = xmldf.select(col("UserData.UserValue._valuegiven"),col("UserData.UserValue._title") ) newdf.show(),因为我将获得这些列名,我需要一个接一个地附加,因此不能像上面的语句一样一次提供它们。
  • 您出错的原因是因为您选择了val df = xmldf.select(col("UserData.UserValue._valueRef")),然后使用以下内容选择了一个不在df中的列,它与newdf相同。如果您想选择所有项目并添加项目,您可以尝试xmldf.select($"*", $"UserData.UserValue._valueRef" as "valref", ...) var newdf = df newdf = newdf.withColumn("col1",df1.col("UserData.UserValue._title")) newdf .show()
  • 是的。我也试过这个,但它不起作用。我认为应该有一种非常简单的方法将它们附加在一起。我只是不知道怎么做。
【解决方案2】:

如果目标是将 xmldf 中的 4 列放入一个新的数据帧中,则首先不应将其拆分为 4 个数据帧。

您可以通过在 select 函数中提供额外的列名来从数据框中选择多个列。

val newdf = xmldf.select(
    col("UserData.UserValue._valueRef"), 
    col("UserData.UserValue._title"),
    col("author"), 
    col("price"))
newdf.show()

【讨论】:

  • 那是我做不到的。我一一获取列名,因此,我不知道我会得到多少列。所以,我不能把它写成一个单一的陈述。我在问题陈述中提到过。
【解决方案3】:

所以我看了各种方法,最后Ram Ghadiyaram's answer in Solution 2 做了我想做的事。使用这种方法,您可以随时随地组合任意数量的列。基本上,您需要创建索引,您可以通过这些索引将数据框连接在一起,并在连接后完全删除索引列。

【讨论】:

    猜你喜欢
    • 2023-04-07
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 2021-04-26
    相关资源
    最近更新 更多