如何将数据帧从avro转换为GenericRecord in scala
我被困在将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?
创建一个数据帧后:
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))
当我读取avro文件时,df type是“org.apache.spark.sql.DataFrame” df.rdd.toList引发错误... “error:value toList不是org.apache.spark.rdd.RDD的成员[org.apache.spark.sql.Row]” –
listOfStrings:org.apache.spark.rdd.RDD [org.apache.spark。 sql.Row] = MapPartitionsRDD [15]在rdd处
yeah得到的结果,但仅适用于r(0)..不适用于整个RDD ... –
你为什么要Daraframe转换为其他对象?我认为它应该排成Bytearray而不是整个数据帧。 –
是啊... Row to ByteArray对我来说也很好... –