如何将Avro Schema对象转换为spark中的StructType

时间:2016-11-24 14:40:38

标签: apache-spark schema rdd avro

我有一个类型为Row的RDD,即RDD [Row]和avro架构对象。我需要使用此信息创建一个数据帧。

我需要将avro架构对象转换为StructType以创建DataFrame。

你能帮忙吗?

5 个答案:

答案 0 :(得分:5)

com.databricks.spark.avro有一个类可以帮助您解决这个问题。

 StructType requiredType = (StructType) SchemaConverters.toSqlType(AvroClass.getClassSchema()).dataType();

请仔细阅读以下具体示例:http://bytepadding.com/big-data/spark/read-write-parquet-files-using-spark/

答案 1 :(得分:3)

自2020年5月31日更新

如果您使用的Scala 2.12具有更新的Spark版本,请在下面使用。

sbt:

scalaVersion := "2.12.11"
val sparkVersion = "2.4.5"
libraryDependencies += "org.apache.spark" %% "spark-avro" % sparkVersion
import org.apache.spark.sql.avro.SchemaConverters
import org.apache.spark.sql.types.StructType

val schemaType = SchemaConverters
  .toSqlType(avroSchema)
  .dataType
  .asInstanceOf[StructType]

答案 2 :(得分:1)

Databrics支持spark-avro包中与avro相关的实用程序,在sbt中使用以下依赖项 " com.databricks" %" spark-avro_2.11" %" 3.2.0"

代码

*

  

val sqlSchema = SchemaConverters.toSqlType(avroSchema)

*

之前' 3.2.0'版本,' toSqlType'是私有方法所以如果您使用的是旧版本而不是3.2,那么在您自己的util类中复制完整方法,否则升级到最新版本。

答案 3 :(得分:1)

在pyspark中做同样的例子吗?下面的代码对我有用,但是应该有其他更简单的方法

pyspark-打包org.apache.spark:spark-avro_2.11:2.4.4

导入请求

导入操作系统

导入avro.schema

从pyspark.sql.types导入StructType

schema_registry_url ='https://schema-registry.net/subjects/subject_name/versions/latest/schema' schema_requests = requests.get(url = schema_registry_url)

spark_type = sc._jvm.org.apache.spark.sql.avro.SchemaConverters.toSqlType(sc._jvm.org.apache.avro.Schema.Parser()。parse(schema_requests.text))

答案 4 :(得分:0)

在 pyspark 2.4.7 中,我的解决方案是使用 avroschema 创建一个空数据框,然后从这个空数据框中获取 StructType 对象。

with open('/path/to/some.avsc','r') as avro_file:
    avro_scheme = avro_file.read()

df = spark\
    .read\
    .format("avro")\
    .option("avroSchema", avro_scheme)\
    .load()

struct_type = df.schema