将 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 是不是被索引?