2017-10-16 78 views
0

我被困在將avro數據框轉換爲GenericRecord/ByteArray,我在Google上衝浪,他們爲我提供了另一種解決方案。如何將數據幀從avro轉換爲GenericRecord in scala

有沒有人試圖將AVRO RDD/Dataframes轉換爲GenericRecord或ByteArray在scala中?

我用這個命令來讀取我的avro文件。

spark.read.avro("/app/q.avro") 

它返回像這樣的數據幀。

res0: org.apache.spark.sql.DataFrame = [recordType: string, recordVersion: string ... 6 more fields] 

那麼如何將sql.DataFrame轉換爲GenericRecord/ByteArray?

+0

你爲什麼要Daraframe轉換爲其他對象?我認爲它應該排成Bytearray而不是整個數據幀。 –

+0

是啊... Row to ByteArray對我來說也很好... –

回答

0

創建一個數據幀後:

val df=spark.read.avro("/app/q.avro") 

你可以把它轉換成一個或者RDD或字符串列表。

val listOfStrings=df.rdd.collect.toList 

現在,你可以字符串列表轉換爲字節組,就像這樣:

scala> var lst=List("scala","Java","Python","JavaScript") 
lst: List[String] = List(scala, Java, Python, JavaScript) 

scala> lst.map(_.getBytes).toArray 
res5: Array[Array[Byte]] = Array(Array(115, 99, 97, 108, 97), Array(74, 97, 118, 97), Array(80, 121, 116, 104, 111, 110), Array(74, 97, 118, 97, 83, 99, 114, 105, 112, 116)) 
+0

當我讀取avro文件時,df type是「org.apache.spark.sql.DataFrame」 df.rdd.toList引發錯誤... 「error:value toList不是org.apache.spark.rdd.RDD的成員[org.apache.spark.sql.Row]」 –

+0

listOfStrings:org.apache.spark.rdd.RDD [org.apache.spark。 sql.Row] = MapPartitionsRDD [15]在rdd處:28 –

+0

yeah得到的結果,但僅適用於r(0)..不適用於整個RDD ... –