簡體   English   中英

如何在 spark 中將 Avro Schema 對象轉換為 StructType

[英]How to convert Avro Schema object into StructType in spark

我有一個 Row 類型的 RDD,即 RDD[Row] 和 avro 模式對象。我需要用這個信息創建一個數據框。

我需要將 avro 架構對象轉換為 StructType 以創建 DataFrame。

你能幫忙嗎。

com.databricks.spark.avro 有一個課程可以幫助您解決這個問題

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

請通過這個具體的例子: http : //bytepadding.com/big-data/spark/read-write-parquet-files-using-spark/

更新至 2020-05-31

如果您使用的是帶有較新 Spark 版本的 Scala 2.12 ,請在下面使用。

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]

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 類中復制完整方法,否則升級到最新版本。

在pyspark中做同樣的任何例子嗎? 下面的代碼對我有用,但應該有其他更簡單的方法來做到這一點

# pyspark --packages org.apache.spark:spark-avro_2.11:2.4.4

import requests
import os
import avro.schema

from pyspark.sql.types import 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))

在 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM