【问题标题】:How to convert Dataframes from avro to GenericRecord in scala如何在scala中将数据帧从avro转换为GenericRecord
【发布时间】:2017-10-17 02:26:34
【问题描述】:

我被困在将 avro 数据帧转换为 GenericRecord/ByteArray 时,我在 google 中冲浪,它们反过来为我提供了解决方案。

有没有人尝试在 Scala 中将 AVRO RDD/Dataframes 转换为 GenericRecord 或 ByteArray?

我使用这个命令来读取我的 avro 文件。

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

它会返回这样的数据帧。

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

那么如何将 sql.DataFrame 转换为 GenericRecord/ByteArray?

【问题讨论】:

  • 为什么要将 Daraframe 转换为其他对象?我认为它应该是 Bytearray 的行而不是整个数据帧。
  • 是的... Row to ByteArray 对我来说也很好...

标签: scala apache-spark


【解决方案1】:

创建数据框后:

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

您可以将其转换为 rdd 或字符串列表。

val listOfStrings=df.rdd.collect.toList

现在,您可以将字符串列表转换为 byteArray,如下所示:

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 类型为 "org.apache.spark.sql.DataFrame" df.rdd.toList 抛出错误..." 错误:值 toList 不是org.apache.spark.rdd.RDD[org.apache.spark.sql.Row]"
  • listOfStrings: org.apache.spark.rdd.RDD[org.apache.spark.sql.Row] = MapPartitionsRDD[15] at rdd at :28
  • val listOfStrings = df.rdd.collect.toList listOfStrings: List[org.apache.spark.sql.Row] val r = listOfStrings.getBytes :30: error: value getBytes is not List[org.apache.spark.sql.Row] 的成员 val r = listOfStrings.getBytes
  • listOfStrings.map(_.toByte).toArray 试试这个
  • listOfStrings.map(.toString).toArray r.map(.toByte).toArray java.lang.NumberFormatException:对于输入字符串:
猜你喜欢
  • 1970-01-01
  • 2018-07-27
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-31
  • 2022-08-17
  • 2018-12-05
相关资源
最近更新 更多