2015-09-21 47 views
4

我正在使用spark 1.5。我想從HDFS中的文件創建一個dataframe。 HDFS文件包含具有序列輸入文件格式的大量字段的json數據。如何從sequenceFile創建火花DataFrame

有沒有辦法在java中優雅地做到這一點?我不提前知道json的結構/字段。

我能夠採取從序列文件輸入作爲RDD如下:

JavaPairRDD<LongWritable,BytesWritable> inputRDD = jsc.sequenceFile("s3n://key_id:[email protected]/path", LongWritable.class, BytesWritable.class); 
JavaRDD<String> events = inputRDD.map(
    new Function<Tuple2<LongWritable,BytesWritable>, String>() { 
     public String call(Tuple2<LongWritable,BytesWritable> tuple) { 
      return Text.decode(tuple._2.getBytes()); 
     } 
    } 
); 

如何創建從這個RDD一個數據幀?

+0

數據幀需要某種定義的結構/模式的,當您轉換的RDD數據幀。你能夠探索一下數據並確定JSON結構嗎?您能否與您的數據源提供商交談並就共同模式達成一致? –

+1

你不能簡單地調用'sqlContext.createDataFrame(events)'嗎?你不必真正定義一個模式,如果你不這樣做,列將被簡單地命名爲C0,C1等。 –

+0

@GlennieHellesSindholt:謝謝你的發帖。是的,我終於明白了。有用! – nish

回答

0

我確實在我的序列文件JSON數據如下:

JavaRDD<String> events = inputRDD.map(
    new Function<Tuple2<LongWritable,BytesWritable>, String>() { 
     public String call(Tuple2<LongWritable,BytesWritable> tuple) throws JSONException, UnsupportedEncodingException { 
      String valueAsString = new String(tuple._2.getBytes(), "UTF-8"); 
      JSONObject data = new JSONObject(valueAsString); 
      JSONObject payload = new JSONObject(data.getString("payload")); 
      String atlas_ts = ""; 
      return payload.toString(); 
     } 
    } 
    );