java - 如何在spark中读取HDFS序列文件

标签 java hadoop apache-spark hdfs

我正在尝试将文件从 HDFS(本例中为 s3)读取到 Spark 作为 RDD。该文件采用 SequenceInputFileFormat 格式。但我无法将文件的内容解码为字符串。我有以下代码:

package com.spark.example.ExampleSpark;

import java.util.List;
import scala.Tuple2;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SQLContext;
import org.apache.spark.sql.DataFrame;
import org.apache.spark.sql.hive.HiveContext;


public class RawEventDump 
{
    public static void main( String[] args )
    {

        SparkConf conf = new SparkConf().setAppName("atlas_raw_events").setMaster("local[2]");
        JavaSparkContext jsc = new JavaSparkContext(conf);

        JavaPairRDD<String, Byte> file = jsc.sequenceFile("s3n://key_id:secret_key@<file>", String.class, Byte.class);
        List<String> values = file.map(
            new Function<Tuple2<String, Byte>, String>() {
            public String call(Tuple2 row) {
                return "Value: " + row._2.toString() + "\n";
            }
        }).collect();
        System.out.println(values);
    }
}

但我得到以下输出:

Value: 7b 22 65 76 65 6e ...
, Value: 7b 22 65 76 65 6e 74 22 3a ...
, Value: 7b 22 65 76 65 6...
...

如何在spark中读取文件的内容?

最佳答案

序列文件通常使用 Hadoop 类型,如 TextWritable、BytesWritable、LongWritable 等,因此 RDD 类型应为 JavaPairRDD<LongWritable, BytesWritable>

然后要转换字符串,您应该调用 org.apache.hadoop.io.Text.decode(row._2.getBytes())

关于java - 如何在spark中读取HDFS序列文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32694243/

相关文章:

java - 父类中模板方法的右访问修饰符

hadoop - s3distcp 在显示 100% 后挂起

mysql - SQOOP导入相关查询

apache-spark - 如何避免每次执行查询时进行查询准备(解析、计划和优化)?

sql - Spark SQL 中的日期和间隔加法

scala - 如何在给定多个条件的情况下对 Spark 数据帧执行 "Lookup"操作

java - 在具有以下 api 21 的设备上运行时,CardView 不显示

java - 使用 Java 在 Excel 中打开文件

hadoop - Sqoop 默认创建 6 个映射器?

Java和Firebird Embedded如何设置?