当前位置: 首页 > 知识库问答 >
问题:

你怎么写一个数据帧/RDD与自定义分隔符(ctrl-A分隔)文件在火花scala?

罗安和
2023-03-14

我正在处理poc,我需要在其中创建数据帧,然后将其保存为ctrl分隔的文件。下面是我创建中间结果的查询

val grouped = results.groupBy("club_data","student_id_add","student_id").agg(sum(results("amount").cast(IntegerType)).as("amount"),count("amount").as("cnt")).filter((length(trim($"student_id")) > 1) && ($"student_id").isNotNull)

将结果保存在文本文件中

grouped.select($"club_data", $"student_id_add", $"amount",$"cnt").rdd.saveAsTextFile("/amit/spark/output4/")

输出:

 [amit,DI^A356035,581,1]

它将数据保存为逗号分隔,但我需要将其保存为ctrl-A单独我尝试了选项(“分隔符”、“\u0001”),但它似乎不受dataframe/rdd的支持。

有什么帮助的功能吗?

共有3个答案

方子安
2023-03-14

保存前将行转换为文本:

grouped.select($"club_data", $"student_id_add", $"amount",$"cnt").map(row => row.mkString(\u0001")).saveAsTextFile("/amit/spark/output4/") 
关浩壤
2023-03-14
df.rdd.map(x=>x.mkString("^A")).saveAsTextFile("file:/home/iot/data/stackOver")
公西兴业
2023-03-14

如果您有一个数据帧,您可以使用Spark CSV作为CSV写入,并使用以下分隔符。

df.write.mode(SaveMode.Overwrite).option("delimiter", "\u0001").csv("outputCSV")

使用旧版本的Spark

df.write
    .format("com.databricks.spark.csv")
    .option("delimiter", "\u0001")
    .mode(SaveMode.Overwrite)
    .save("outputCSV")

您可以按如下方式进行阅读

spark.read.option("delimiter", "\u0001").csv("outputCSV").show()

如果您有一个RDD,则可以使用RDD上的函数来保存

rdd.map(r => r.mkString(\u0001")).saveAsTextFile("outputCSV")

希望这有帮助!

 类似资料:
  • 我想用Apache Spark读入具有以下结构的文件。 csv太大了,不能使用熊猫,因为读取这个文件需要很长时间。有什么方法类似于 多谢!

  • 问题内容: 如何为角度JS使用自定义定界符?我想将语法从更改为。 有人可以教我一个完整的示例,以了解如何使用Angular来实现吗? 问题答案: 您可以用来更改用于AngularJS表达式的开始/结束符号: 然后,在您的模板中: 这是工作中的jsFiddle:http : //jsfiddle.net/Bvc62/3/ 在此处查看有关服务的文档:http : //docs.angularjs.or

  • 我正试图用在中添加自定义分隔符,但没有成功,我已经搜索了很多,并查看了下面提到的答案,但这对我没有帮助 链接1 链接2 链接3 我想在的每个项之间加上黑线,如下所示。 我在每行之间都有水平线,但不知道如何在列之间得到这些线。 chintan Soni的答案工作很好,但它只在一个场景中产生问题,当我有5个视图时,它还显示了其他3个项目的分界线,如下所示:

  • 我有5个表存储为CSV文件(A.CSV、B.CSV、C.CSV、D.CSV、E.CSV)。每个文件按日期分区。如果文件夹结构如下:

  • [新加入Spark]语言-Scala 根据文档,RangePartitioner对元素进行排序并将其划分为块,然后将块分发到不同的机器。下面的例子说明了它是如何工作的。 假设我们有一个数据框,有两列,一列(比如“a”)的连续值从1到1000。还有另一个数据帧具有相同的模式,但对应的列只有4个值30、250、500、900。(可以是任意值,从1到1000中随机选择) 如果我使用RangePartit

  • 我通过指定分区的数量从文本文件创建RDD(Spark 1.6)。但它给我的分区数与指定的分区数不同。 案例1 案例2 案例3 案例4 文件/home/pvikash/data/test的内容。txt是: 这是一个测试文件。将用于rdd分区 基于以上案例,我有几个问题。 对于案例2,显式指定的分区数为0,但实际分区数为1(即使默认最小分区为2),为什么实际分区数为1? 对于案例3,为什么在指定数量的