2017-05-05 28 views
0

我有一个地图,其值来自数据库中的多个不同列。这些值之间具有下划线。例如,如何在Scala中分割地图中的值?

newMap("A", 23_null_12_09asfA) 

这里,23来自列A,而来自列B等,等等。现在,考虑一个有20个值的地图。我想知道如何将这些值拆分为数组或如何拆分和存储它们?

+0

“分裂一下子,把它放在一个数据帧” - 你什么意思?你能展示一个期望输出的例子吗?如果整个集合只有20条记录,那么使用DataFrames的目的是什么?DataFrame有助于分布式地处理大集合,并且只会为小集合创造不必要的开销。 –

+0

整个集合有超过50,000条记录,但是我以20为例。 –

+0

我会更加清楚。我有这样的值23_null_23dA。我想分割这些值,将它们存储起来,并想用原始值执行检查。 –

回答

0
val baseRDD=sc.parallelize(List(("john","1_abc_2"),("jack","3_xyz_4"))) 
val sRDD = baseRDD.map(x=> x._2.split("_")) 
val resultDF=sRDD.toDF 
resultDF.show 

| [1,abc,2] |
| [3,xyz,4] |

0

据我从你的问题,解释明白,下面就可以是你的解决方案

val newMap: HashMap[String, String] = HashMap(("A", "23_null_12_09asfA"), 
    ("B", "24_null_13_09asfB"), 
    ("C", "25_null_14_09asfC"), 
    ("D", "25_null_14_09asfC"), 
    ("E", "25_null_14_09asfC"), 
    ("F", "25_null_14_09asfC"), 
    ("G", "25_null_14_09asfC")) 

val schema = StructType(Array(StructField("col1", StringType, true), 
    StructField("col2", StringType, true), 
    StructField("col3", StringType, true), 
    StructField("col2", StringType, true))) 

val rdd = sparkContext.parallelize(newMap.map(hashmap => Row.fromSeq(hashmap._2.split("_"))).toSeq) 

sqlContext.createDataFrame(rdd, schema).show 

我希望这是有帮助的