将 Spark Dataframes 的每一行转换为一个字符串,并在 scala 中的每列值之间使用分隔符

Posted

技术标签:

【中文标题】将 Spark Dataframes 的每一行转换为一个字符串,并在 scala 中的每列值之间使用分隔符【英文标题】:Convert Spark Dataframes each row as a String with a delimiter between each column value in scala 【发布时间】:2016-10-31 23:50:22 【问题描述】:

我想将 Spark Dataframe 的每一行转换为一个字符串,每列值之间有一个分隔符。

例如: 我有一个输入数据框“df”,其中包含 3 列“名字”、“姓氏”、“年龄”,其中两条记录如下所示。

第 1 行:约翰·亚伯拉罕 21 第 2 行:史蒂夫·奥斯汀 22

我想创建一个新的数据框,其中只有一列具有如下数据。 第1行:约翰$Abhraham$21 第 2 行:Steve$Austin$22

任何人都可以帮忙吗?

【问题讨论】:

【参考方案1】:

我手边没有 Spark shell,但我认为这个班轮应该可以做到:

def stringifyRows(df: DataFrame, sep: String): DataFrame 
  = df.map(row => row.mkString(sep)).toDf("myColumnName")

对于您的示例,您可以将其称为stringifyRows(myDf, "$")。如果这不起作用,请告诉我错误消息是什么。

【讨论】:

是的,我使用了您的代码。由于函数的返回类型是Dataframe,我不得不在row.mkString(sep)).toDF()之后使用.toDF() 但创建的新数据框的列名为“_1”。我如何在这里给列命名。 您的代码工作正常,谢谢。但是我如何给它的列名。 我知道我可以使用 .withColumn 并重命名列,但是有什么方法可以在调用函数 stringifyRows 本身时给出列名。【参考方案2】:

您可以为此使用concat

例如:

df.select(concat($"firstname", lit("$"), $"lastname", lit("$"), "age")).show()

df.withColumn("newColumnName",concat($"firstname", lit("$"), $"lastname", lit("$"), "age")).show()

【讨论】:

这不是对任意数量的列都有效吗? @Alec:是的,我同意,您的答案是任意列数的正确答案... +1 @Shankar,是的,我实际上有更多的专栏可以使用,所以我认为我必须采用其他方法。

以上是关于将 Spark Dataframes 的每一行转换为一个字符串,并在 scala 中的每列值之间使用分隔符的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark(Dataframes)逐行读取文件(将行转换为字符串)

Spark PairRDDs 和 DataFrames 是不是被索引?

将 RDD 转换为 Dataframe Spark

如何将源文件名添加到 Spark 中的每一行?

将 Spark Dataframe 中的每一行保存到不同的文件中

是否可以将 Spark 中的 data.table 与 Spark Dataframes 一起使用?