使用scala将数据框转换为String并将输出保存到csv

时间:2017-02-15 09:01:41

标签: scala apache-spark dataframe

我想在单个字符串中附加行

+--------------------+
|   defectDescription|
+--------------------+
|ACEView NA : Daework|
|ACEView NA : Documen|
|ACEView NA : ACev   |
|ACEView NA : Dragdro|
+--------------------+

预期输出 ACEView NA:Daework ACEView NA:文件ACEView NA:ACev ACEView NA:Dragdro

4 个答案:

答案 0 :(得分:5)

如果你确实想把所有数据都放到一个字符串中,你可以使用collect:

来完成
val rows = df.select("defectDescription").collect().map(_.getString(0)).mkString(" ")

您首先选择相关列(因此您已经拥有它)并收集它,它会为您提供一系列行。地图将每一行转换为字符串(只有一列 - 0)。然后mkString会创建一个整体字符串,并以空格作为分隔符。

请注意,这会将整个数据帧带到驱动程序,这可能会导致内存异常。如果您只需要一些数据,可以使用take(n)而不是collect来将行数限制为n。

答案 1 :(得分:0)

val str1 = df.select("defectDescription").collect.mkString(",")
val str =  str1.replaceAll("[\\[\\]]","")

另一种方法如下:

第一行选择特定的列,然后收集子集,收集行为如下: 收集(操作)-在驱动程序中将数据集的所有元素作为数组返回。通常在过滤器或其他操作返回足够小的数据子集之后有用。

mkString-mkString方法具有一个重载方法,可让您提供分隔符以分隔集合中的每个元素。

第二行只是替换了其他括号

答案 2 :(得分:0)

fixedDelayString

最初创建数据框的临时视图,然后转换为列表,然后字符串-最后根据所需的输出删除括号。

答案 3 :(得分:0)

让我们利用并行计算的方法是,在要进行关联处理的同时不要过早collect数据:

def str(r: Row) = r.getString(0)
def cat(r0: Row, r1: Row) = Row(s"${str(r0)} ${str(r1)}")

str(df.select("defectDescription").reduce(cat))

这允许在将所有执行器的结果并入驱动程序之前对所有执行器进行并行并排。