我有一个要求,我想将RDD中的每个单独记录写入HDFS中的单个文件。
我是为普通文件系统做的,但很明显,它不适用于HDFS。
stream.foreachRDD{ rdd =>
if(!rdd.isEmpty()) {
rdd.foreach{
msg =>
val value = msg._2
println(value)
val fname = java.util.UUID.randomUUID.toString
val path = dir + fname
write(path, value)
}
}
}
其中 write 是写入文件系统的函数。
有没有办法在spark中做到这一点,以便每个记录我可以原生地写入HDFS,而不使用任何其他工具,如Kafka Connect或Flume ??
编辑:更多解释
例如: 如果我的DstreamRDD有以下记录,
我需要为每条记录使用不同的文件,因此“abcd”的文件不同,“efgh”的文件不同,等等。
我尝试在streamRDD中创建一个RDD,但我知道它是不允许的,因为RDD不可序列化。
答案 0 :(得分:0)
您可以强制将rdd重新分区为no。分区尽可能多。记录然后保存
val rddCount = rdd.count()
rdd.repartition(rddCount).saveAsTextFile("your/hdfs/loc")
答案 1 :(得分:-1)
你可以通过几种方式做到......
从rdd,你可以获得sparkCOntext,一旦你获得了sparkCOntext,你可以使用parallelize方法并将String作为String的列表传递。
例如:
val sc = rdd.sparkContext
sc.parallelize(Seq("some string")).saveAsTextFile(path)
此外,您可以使用sqlContext将字符串转换为DF,然后写入文件。
例如:
import sqlContext.implicits._
Seq(("some string")).toDF