【问题标题】:Spark-Scala: Map the first element of list with every other element of list when lists are of varying lengthSpark-Scala:当列表长度不同时,将列表的第一个元素与列表的每个其他元素映射
【发布时间】:2021-11-23 15:10:45
【问题描述】:

我在纺织品中有以下类型的数据集:

1004,bb5469c5|2021-09-19 01:25:30,4f0d-bb6f-43cf552b9bc6|2021-09-25 05:12:32,1954f0f|2021-09-19 01:27:45,4395766ae|2021-09-19 01:29:13,
1018,36ba7a7|2021-09-19 01:33:00,
1020,23fe40-4796-ad3d-6d5499b|2021-09-19 01:38:59,77a90a1c97b|2021-09-19 01:34:53,
1022,3623fe40|2021-09-19 01:33:00,
1028,6c77d26c-6fb86|2021-09-19 01:50:50,f0ac93b3df|2021-09-19 01:51:11,
1032,ac55-4be82f28d|2021-09-19 01:54:20,82229689e9da|2021-09-23 01:19:47,

我使用sc.textFile 读取文件,它返回一个Array[String] 类型的RDD,之后我执行.map(x=>x.substring(1,x.length()-1)).map(x=>x.split(",").toList) 操作

split.toList 之后,我想将获得的每个列表的第一个元素映射到我使用 .map(x=>(x(0),x(1))).toDF("c1","c2") 的列表的每个其他元素

这适用于那些在拆分后只有一个值但出于明显原因跳过具有多个值的列表的所有其他元素的列表。例如: .map(x=>(x(0),x(1))) 返回 [1020,23fe40-4796-ad3d-6d5499b|2021-09-19 01:38:59] 但此处跳过第三个元素 77a90a1c97b|2021-09-19 01:34:53

如果使用.map(x=>x.split(",").toList) 创建的所有列表长度不同(元素数量不同),我该如何编写返回[1020,23fe40-4796-ad3d-6d5499b|2021-09-19 01:38:59], [1020,77a90a1c97b|2021-09-19 01:34:53] 的映射函数?

【问题讨论】:

  • 你看过tail方法吗?它为您提供列表中除第一个之外的所有元素。
  • 但我需要第一个元素。那是主键。我需要将键与列表的所有元素映射以获得唯一的键值对。就像在示例中一样 - 1020 是具有 2 个后续值的主键。它应该与两者配对。

标签: scala apache-spark mapping


【解决方案1】:

我注意到文件末尾的“,”,但split 忽略了空值。

解决方法如下,试一试就知道了:

// x._n cannot work here initially.
val rdd = spark.sparkContext.textFile("/FileStore/tables/oddfile_01.txt")
val rdd2 = rdd.map(line => line.split(','))
val rdd3 = rdd2.map(x => (x(0), x.tail.toList)) 
val rdd4 = rdd3.flatMap{case (x, y) => y.map((x, _))}
rdd4.collect

不过,这种方法的基数确实发生了变化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2019-11-30
    相关资源
    最近更新 更多