2017-10-16 87 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 ... –