2016-03-25 6 views
0

ネストされたgzファイルに対して、Spark 1.4.1を使用してデータフレーム列の内容を分割するのが難しいです。私はmap関数を使ってgzファイルの属性をマップしました。ネストされたgzファイルのためにSpark 1.4.1を使用してデータフレーム列の内容を分割する

データの形式は次のとおりです。

"id": "tag:1234,89898", 
"actor": 
{ 
    "objectType": "person", 
    "id": "id:1234", 
    "link": "http:\wwww.1234.com/" 
}, 
"body", 

私は列を分割し、データファイルを読み込むには、次のコードを使用しています。

val dataframe= sc.textFile(("filename.dat.gz") 
       .toString()) 
       .map(_.split(",")) 
       .map(r => {(r(0), r(1),r(2))}) 
       .toDF() 

dataframe.printSchema() 

しかし、結果は次のようなものです:これは正しくないフォーマットである

root 
--- _1: string (nullable = true) 
--- _2: string (nullable = true) 
--- _3: string (nullable = true) 

。スキーマを次の形式にします:

----- id 
----- actor 
     ---objectType 
     ---id 
     ---link 
-----body 

何か間違っていますか?私はこのコードを使用して、自分のデータセットで何らかの処理を行い、いくつかの変換を適用する必要があります。

答えて

0

このデータはJSONのようです。幸いにも、SparkはSpark SQLを使用して簡単にJSONデータを処理できます。 Spark Documentationから:ここで

Spark SQL can automatically infer the schema of a JSON dataset and load it as a DataFrame. This conversion can be done using SQLContext.read.json() on either an RDD of String, or a JSON file.

がmakeValidJSON機能については

val sqlContext = new org.apache.spark.sql.SQLContext(sc) 

val myData = sc.textFile("myPath").map(s -> makeValidJSON(s)) 
val myNewData = sqlContext.read.json(myData) 

// The inferred schema can be visualized using the printSchema() method. 
myNewData.printSchema() 

ドキュメントからの例の修正版であるあなたはちょうどそれを得るために、いくつかの文字列解析/操作戦略に集中する必要があります。

これが役に立ちます。

+0

こんにちはbrian、そのa gzファイル。私はgzファイルをアップロードする必要があり、スパークはそれをサポートしていないので、データはJSONのように見えますが、そうではありません。 – user2122466

+0

@ user2122466 Hmmmおそらく、それを読み込み、それをフラット(レコードごとに1つのオブジェクト) 'RDD [String]'にマップし、 'DataFrameReader'''json'関数を新しいRDD 。 DataFrameReaderのドキュメントへのリンクは次のとおりです。https://spark.apache.org/docs/1.4.0/api/java/org/apache/spark/sql/DataFrameReader.html –

+0

こんにちはブライアン、情報ありがとうございます。私にそのコード例を教えてください。私はかつてこれを使ったことがない。 – user2122466

関連する問題