当前位置: 首页 > 知识库问答 >
问题:

火花阿夫罗到镶木地板

赏光霁
2023-03-14

我有一个avro格式的数据流(json编码),需要存储为镶木地板文件。我只能这样做,

val df = sqc.read.json(jsonRDD).toDF()

把df写成拼花地板。

这里的模式是从json中推断出来的。但是我已经有了avsc文件,我不希望spark从json中推断出模式。

以上述方式,parquet文件将模式信息存储为StructType,而不是avro.record.type。是否也有存储avro模式信息的方法。

火花 - 1.4.1

共有2个答案

唐沈义
2023-03-14

您可以以编程方式指定模式

// The schema is encoded in a string
val schemaString = "name age"

// Import Row.
import org.apache.spark.sql.Row;

// Import Spark SQL data types
import org.apache.spark.sql.types.{StructType,StructField,StringType};

// Generate the schema based on the string of schema
val schema =
  StructType(
    schemaString.split(" ").map(fieldName => StructField(fieldName, StringType, true)))

// Convert records of the RDD (people) to Rows.
val rowRDD = people.map(_.split(",")).map(p => Row(p(0), p(1).trim))

// Apply the schema to the RDD.
val peopleDataFrame = sqlContext.createDataFrame(rowRDD, schema)

请看: http://spark.apache.org/docs/latest/sql-programming-guide.html

然后,spark-avro 使用架构类型来指定 avro 类型,如下所示

  • Spark SQL类型-

您可以按如下方式编写 Avro 记录:

import com.databricks.spark.avro._

val sqlContext = new SQLContext(sc)

import sqlContext.implicits._

val df = Seq((2012, 8, "Batman", 9.8),
        (2012, 8, "Hero", 8.7),
        (2012, 7, "Robot", 5.5),
        (2011, 7, "Git", 2.0))
        .toDF("year", "month", "title", "rating")

df.write.partitionBy("year", "month").avro("/tmp/output")
祁刚毅
2023-03-14

最终使用了这个问题的答案 avro-schema-to-spark-structtype

def getSparkSchemaForAvro(sqc: SQLContext, avroSchema: Schema): StructType = {
    val dummyFIle = File.createTempFile("avro_dummy", "avro")
    val datumWriter = new GenericDatumWriter[wuser]()
    datumWriter.setSchema(avroSchema)
    val writer = new DataFileWriter(datumWriter).create(avroSchema, dummyFIle)
    writer.flush()
    writer.close()
    val df = sqc.read.format("com.databricks.spark.avro").load(dummyFIle.getAbsolutePath)
    df.schema
}
 类似资料:
  • 现在Spark 2.4已经内置了对Avro格式的支持,我正在考虑将数据湖中某些数据集的格式从Parquet更改为Avro,这些数据集通常是针对整行而不是特定列聚合进行查询/联接的。 然而,数据之上的大部分工作都是通过Spark完成的,据我所知,Spark的内存缓存和计算是在列格式的数据上完成的。在这方面,Parquet是否提供了性能提升,而Avro是否会招致某种数据“转换”损失?在这方面,我还需要

  • 正在尝试读取avro文件。 无法将运行到Avro架构的数据转换为Spark SQL StructType:[“null”,“string”] 尝试手动创建架构,但现在遇到以下情况: 通用域名格式。databricks。火花阿夫罗。SchemaConverters$CompatibleSchemaException:无法将Avro架构转换为catalyst类型,因为路径处的架构不兼容(avroTyp

  • 我通过两种方法生成拼花地板文件:动弹消防软管和火花作业。它们都被写入S3上相同的分区结构中。两组数据都可以使用相同的Athena表定义进行查询。两者都使用gzip压缩。 然而,我注意到Spark生成的拼花地板文件大约是Firehose生成的拼花地板文件的3倍大。有什么理由会这样吗?在使用Pyarrow加载模式和元数据时,我确实注意到了一些差异: 模式差异可能是罪魁祸首吗?还有别的原因吗? 这两个特

  • 业务案例是,我们希望通过一个列作为分区,将一个大的拼花文件分割成多个小文件。我们已经使用data frame . partition(“XXX”)进行了测试。写(...).用了大约1个小时,记录了10万个条目。因此,我们将使用map reduce在不同的文件夹中生成不同的拼花文件。示例代码: 上面的例子只是生成一个文本文件,如何用multipleoutputformat生成一个parquet文件?

  • 在Spring-Cloud-Stream中是否有支持或计划支持avro和/或来自汇流平台的模式注册表?我发现spring-integration-kafka 1.3.0版中存在对avro的依赖,而spring-cloud-stream-binder-kafka的主分支(2.0)和spring-kafka没有任何avro依赖。

  • 我的Snowflake表包含一个创建为的字段,默认为作为Snowflake数据类型。 当我用COPY命令将这个表以parquet格式卸载到s3时,我希望保留整个模式,包括这个字段的精度。但是,生成的parquet具有。 是否可以强制保持雪花数据类型精度不变?