2017-07-30 3 views
0

私はzeppelinノートブックで作業していて、SQLを使用してテーブルからデータをロードしようとしています。 表内の各行には、JSONブロブである1つの列があります。たとえば、[{'timestamp':12345,'value':10},{'timestamp':12346,'value':11},{'timestamp':12347,'value':12}]spark sqlを使用してJson WrappedArrayを文字列に変換します

元の文字列のように、JSON BLOBを文字列として選択したいとします。しかし、自動的にWrappedArrayとしてロードされます。

WrappedArrayを文字列に変換するためにUDFを記述する必要があるようです。以下は私のコードです。

まず、Scala関数を定義して関数を登録します。そして列に登録された関数を使用します。

val unwraparr = udf ((x: WrappedArray[(Int, Int)]) => x.map { case Row(val1: String) => + "," + val2 }) 
sqlContext.udf.register("fwa", unwraparr) 

これは機能しません。誰でも手伝っていただければ幸いです。

以下は、私が取り組んでいる部分のスキーマです。量とタイムスタンプのペアがたくさんあります。

-- targetColumn: array (nullable = true) 
    |-- element: struct (containsNull = true) 
    | |-- value: long (nullable = true) 
    | |-- timeStamp: string (nullable = true) 

UPDATE:私はそれが単一の文字列にオブジェクト/構造体/行(構造体を呼び出す方法がわからないが)CONCATする必要が

val f = (x: Seq[Row]) => x.map { case Row(val1: Long, val2: String) => x.mkString("+") } 

: 私は、次のコードを思い付きます。

+0

'dataframe'の' schema'で更新できますか? 'dataframe.printSchema()'の出力を貼り付けてコピーするだけです。 –

+0

@RameshMaharjan更新されました。ありがとう! – Ryan

+0

希望の出力を更新してください。 –

答えて

1

sparkdataframe/datasetとしてロードされたデータは以下のように使用すると、一時的なJSONファイルにjsonとしてdataframeを書いて、テキストファイルとしてそれを読むとString lineを解析することができますschemaその後

+------------------------------------+ 
|targetColumn      | 
+------------------------------------+ 
|[[12345,10], [12346,11], [12347,12]]| 
|[[12345,10], [12346,11], [12347,12]]| 
+------------------------------------+ 

root 
|-- targetColumn: array (nullable = true) 
| |-- element: struct (containsNull = true) 
| | |-- timeStamp: string (nullable = true) 
| | |-- value: long (nullable = true) 

ようであればそして

df.write.mode(SaveMode.Overwrite).json("/home/testing/test.json") 

val data = sc.textFile("/home/testing/test.json") 

val rowRdd = data.map(jsonLine => Row(jsonLine.split(":\\[")(1).replace("]}", ""))) 
val stringDF = sqlContext.createDataFrame(rowRdd, StructType(Array(StructField("targetColumn", StringType, true)))) 
/home/testing/test.jsonが一時的 jsonファイルの場所である)として、以下の dataframeに変換私は答えは

役立つことを願うdataframeschema

+--------------------------------------------------------------------------------------------------+ 
|targetColumn                      | 
+--------------------------------------------------------------------------------------------------+ 
|{"timeStamp":"12345","value":10},{"timeStamp":"12346","value":11},{"timeStamp":"12347","value":12}| 
|{"timeStamp":"12345","value":10},{"timeStamp":"12346","value":11},{"timeStamp":"12347","value":12}| 
+--------------------------------------------------------------------------------------------------+ 

root 
|-- targetColumn: string (nullable = true) 

を次のようにあなたを残しすべき

はあなたが読んで、つまり答えの私の第二段階を使用することができ、テキストデータフレームではない

として最初に読んでjsonファイルと解析から、データフレームを取得する最初の段階に進みます。

関連する問題