Spark-Scala:当列表长度不同时,将列表的第一个元素映射到列表的每个其他元素
Spark-Scala: Map the first element of list with every other element of list when lists are of varying length
我在纺织品中有以下类型的数据集:
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
读取文件,其中 returns 类型为 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)))
returns [1020,23fe40-4796-ad3d-6d5499b|2021-09-19 01:38:59]
但是这里跳过了第三个元素 77a90a1c97b|2021-09-19 01:34:53
鉴于使用 .map(x=>x.split(",").toList)
创建的所有列表长度不同(元素数量不同),我如何编写一个 returns [1020,23fe40-4796-ad3d-6d5499b|2021-09-19 01:38:59], [1020,77a90a1c97b|2021-09-19 01:34:53]
的映射函数?
我注意到文件末尾的“,”,但是 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
但是这种方法中的基数确实发生了变化。
我在纺织品中有以下类型的数据集:
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
读取文件,其中 returns 类型为 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)))
returns [1020,23fe40-4796-ad3d-6d5499b|2021-09-19 01:38:59]
但是这里跳过了第三个元素 77a90a1c97b|2021-09-19 01:34:53
鉴于使用 .map(x=>x.split(",").toList)
创建的所有列表长度不同(元素数量不同),我如何编写一个 returns [1020,23fe40-4796-ad3d-6d5499b|2021-09-19 01:38:59], [1020,77a90a1c97b|2021-09-19 01:34:53]
的映射函数?
我注意到文件末尾的“,”,但是 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
但是这种方法中的基数确实发生了变化。