【问题标题】:Spark: Read a csv file into a map like structure using scalaSpark:使用scala将csv文件读入类似结构的地图
【发布时间】:2017-03-26 20:36:39
【问题描述】:

我有一个格式为 csv 的文件:

key, age, marks, feature_n
abc, 23, 84, 85.3
xyz, 25, 67, 70.2

这里的功能数量可能会有所不同。例如:我有 3 个特征(年龄、标记和 feature_n)。我必须将其转换为 Map[String,String] 如下:

[key,value]
["abc","age:23,marks:84,feature_n:85.3"]
["xyz","age:25,marks:67,feature_n:70.2"]

我必须将上述数据与“键”列上的另一个数据集 A 连接起来,并将“值”附加到数据集 A 中的另一列。csv 文件可以加载到具有架构的数据框中(架构由csv 文件)。

val newRecords = sparkSession.read.option("header", "true").option("mode", "DROPMALFORMED").csv("/records.csv");

发布此消息后,我会将数据框 newRecords 与数据集 A 连接起来,并将“值”附加到数据集 A 的列之一。

如何遍历每一行的每一列,不包括列“key”并从 newRecords 生成格式为“age:23,marks:84,feature_n:85.3”的字符串?

如果有帮助,我可以更改 csv 文件的格式并将数据保存为 JSON 格式。

我对 Scala 和 Spark 还很陌生。

【问题讨论】:

  • 这在我看来就像一个标准的地图/收集操作。你能澄清一下你在哪里遇到问题吗?
  • 特征的数量可以是可变的。我试图通过将最后一个功能命名为 feature_n 来表示相同的意思。所以我需要迭代可变数量的列来生成最终的字符串。抱歉,问题中没有明确说明。

标签: scala csv apache-spark


【解决方案1】:

我会建议以下解决方案:

val updated:RDD[String]=newRecords.drop(newRecords.col("key")).rdd.map(el=>{val a=el.toSeq;val st= "age"+a.head+"marks:"+a(1)+" feature_n:"+a.tail; st})

【讨论】:

  • 特征的数量可以是可变的。我试图通过将最后一个功能命名为 feature_n 来表示相同的意思。所以我需要迭代可变数量的列来生成最终的字符串。抱歉,问题中没有明确说明。
猜你喜欢
  • 2018-04-26
  • 2013-09-30
  • 2020-02-07
  • 2015-12-04
  • 1970-01-01
  • 2019-01-31
  • 2013-12-11
  • 2019-03-01
  • 1970-01-01
相关资源
最近更新 更多