Spark:将RDD中的每条记录写入HDFS目录

时间:2017-02-14 14:48:05

标签: scala apache-spark hdfs spark-streaming rdd

我有一个要求,我想将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
  • ijkl
  • MNOP

我需要为每条记录使用不同的文件,因此“abcd”的文件不同,“efgh”的文件不同,等等。

我尝试在streamRDD中创建一个RDD,但我知道它是不允许的,因为RDD不可序列化。

2 个答案:

答案 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