【问题标题】:Filtering dataframe in spark and saving as avro在火花中过滤数据帧并保存为avro
【发布时间】:2016-05-18 15:46:10
【问题描述】:

我正在尝试将数据框保存为 avro 文件。我读过一个包含许多嵌套层的 xml 文件。它将其存储为数据框。数据帧存储成功。 xml 有许多名称空间标头,例如 @nso、@ns1、@ns2 等。这些成为数据帧中的标头。当我尝试将其保存为 avro 文件时,它给了我这个错误:“线程“主”中的异常 org.apache.avro.SchemaParseException:非法初始字符:@ns0”

val conf = new SparkConf()
         .setMaster("local[2]")
         .setAppName("conversion")
val sc = new SparkContext(conf)

val sqlContext = new SQLContext(sc)

val df = sqlContext.read
  .format("com.databricks.spark.xml")
  .option("rowTag", "Stuff")
  .load("sample.xml")

df.printSchema()
df.show()

df.write
  .format("com.databricks.spark.avro")
  .save("output")

【问题讨论】:

    标签: xml parsing apache-spark rdd avro


    【解决方案1】:

    有效的 Avro 名称 has to start with a letter or an underscore,因此您可以重命名从属性生成的列或指定替代前缀。 spark-csv 允许您使用 attributePrefix 属性配置属性前缀:

    val df = sqlContext.read
      .format("com.databricks.spark.xml")
      .option("rowTag", "Stuff")
      .option("attributePrefix", "attr_")  // or some other prefix of your choice
      .load("sample.xml")
    

    【讨论】:

    • 我试过这个解决方案。它成功替换了 xml 的 xmlns 标头 - 带有 @ 符号的标头。但是,当ns0、ns1 元素在嵌套层里面时仍然存在问题。你知道怎么换吗?
    • 您能否提供一个失败的小示例输入?这听起来像一个错误。
    • 好的,所以剩下的问题是ns1:PublicID 也不是一个有效的名称,因为:?如果是这样,我认为除了重命名之外没有其他解决方案,这对于嵌套对象并不完全简单。
    • 我一直在思考如何解决这个问题。您认为使用正则表达式转换为 rdd 并过滤所有 : out 有意义吗?
    • 无需触摸数据。所需要的只是重写模式。它不是特别复杂的对象,如果需要,可以通过重命名轻松遍历。
    猜你喜欢
    • 2020-08-09
    • 2016-05-01
    • 1970-01-01
    • 2023-03-29
    • 2016-06-23
    • 2019-01-14
    • 1970-01-01
    • 2015-12-16
    • 2018-10-27
    相关资源
    最近更新 更多