【问题标题】:Spark Scala - reading Sequence files with multiple key types?Spark Scala - 读取具有多种键类型的序列文件?
【发布时间】:2018-03-15 01:10:44
【问题描述】:

我的序列文件具有LongWritableText 的键。这些值都是相同的格式(json)。我想在一个 spark 作业中一次处理它们,但我不知道如何编写代码,因此它适用于 TextLongWritable 键。实际上,我什至不关心我工作中的序列记录键,我没有使用它们。

这就是我为LongWritable 所做的事情。我将如何增强它以适用于 LongWritableText 键?有没有办法只加载序列文件记录值而忽略键?

val rdd = sparkCtx.sequenceFile[Long, String](srcDir)

// put into Json records, don't care about seq key
val jsonRecs = rdd.map((record: (Long, String)) => new String(record._2))

【问题讨论】:

  • 也许您可以分别读取TextLongWritable 文件,在丢弃密钥后只需union 您的rdds?
  • 我真的没有一个简单的方法来区分它们。但是,我想我已经找到了一种方法来做到这两点。 NullWritable 似乎对两者都有效。

标签: scala hadoop apache-spark


【解决方案1】:

这是我使用 NullWritable 的解决方案,适用于 Text 和 LongWritable seq 文件键。

我在本地测试期间从本地文本文件读取,在集群上运行时从 HDFS 读取。

     var rdd = if (inputFileType.equalsIgnoreCase(InputFileType_Text)) {
        // Read local text file
        // Tried using a NullWritable here for local testing, but it throws
        // a 'Not Serializable' error.  Using null instead.
        sparkCtx.textFile(srcDir).map(line => {
           val tokens = line.split("\t")
           (null, tokens(1))
        })
     } else  {
        // Default to assuming sequence files are input
        // Read HDFS directory of seq files.
        log.debug("SEQUENCE files, srcDir={}", srcDir)
        sparkCtx.sequenceFile[NullWritable, String](srcDir)
     }
     log.debug("LOADED: rdd<NullWritable,String>")

     // Json records
     val jsonRecs = rdd.map((record: (NullWritable, String)) => new String(record._2))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多