Apache spark 我们可以从AVRO模式自动生成spark SQL查询吗?

Apache spark 我们可以从AVRO模式自动生成spark SQL查询吗?,apache-spark,apache-spark-sql,avro,spark-avro,Apache Spark,Apache Spark Sql,Avro,Spark Avro,我正在做一个项目,每天我都需要处理成吨的AVRO文件。为了从AVRO中提取数据,我使用sparkSQL。要实现这一点,首先需要printSchema,然后需要选择字段以查看数据。我想自动化这个过程。给定AVRO的任何输入,我想编写一个脚本,该脚本将考虑avsc文件中的结构和数组自动生成SparkSQL查询。我可以用Java或Python编写脚本 -样本输入AVRO -我期待的输出 您可以使用类似的方法根据架构生成列列表: 导入org.apache.spark.sql.types.{StructF

我正在做一个项目,每天我都需要处理成吨的AVRO文件。为了从AVRO中提取数据,我使用sparkSQL。要实现这一点,首先需要printSchema,然后需要选择字段以查看数据。我想自动化这个过程。给定AVRO的任何输入,我想编写一个脚本,该脚本将考虑avsc文件中的结构和数组自动生成SparkSQL查询。我可以用Java或Python编写脚本

-样本输入AVRO

-我期待的输出


您可以使用类似的方法根据架构生成列列表:

导入org.apache.spark.sql.types.{StructField,StructType} def getStructFieldNamef:StructField,baseName:String=:Seq[String]={ val bname=如果baseName.isEmpty else baseName+。 f、 数据类型匹配{ 案例结构类型=> s、 flatMapx=>getStructFieldNamex,bname+f.name case=>Seqbname+f.name } } 然后可以在真实的数据帧上使用,如下所示:

val data=spark.read.jsonsome_data.json val cols=data.schema.flatmappx=>getStructFieldNamex 结果,我们得到了字符串序列,我们可以使用它进行选择:

导入org.apache.spark.sql.functions.col data.selectcols.mapcol:_* 或者,我们可以生成一个逗号分隔的列表,用于spark.sql:

spark.sqls从表中选择${cols.mkString,}
您可以使用类似的方法根据架构生成列列表:

导入org.apache.spark.sql.types.{StructField,StructType} def getStructFieldNamef:StructField,baseName:String=:Seq[String]={ val bname=如果baseName.isEmpty else baseName+。 f、 数据类型匹配{ 案例结构类型=> s、 flatMapx=>getStructFieldNamex,bname+f.name case=>Seqbname+f.name } } 然后可以在真实的数据帧上使用,如下所示:

val data=spark.read.jsonsome_data.json val cols=data.schema.flatmappx=>getStructFieldNamex 结果,我们得到了字符串序列,我们可以使用它进行选择:

导入org.apache.spark.sql.functions.col data.selectcols.mapcol:_* 或者,我们可以生成一个逗号分隔的列表,用于spark.sql:

spark.sqls从表中选择${cols.mkString,}
添加一个示例输入&您的预期输出??从表中简单选择*不起作用?它起作用,但不是我想要的。基本上,select*from以列格式显示展平字段,以数组格式显示结构和数组,如[col a、col b、col c]。我的动机是生成自动查询或获取字段名及其字段类型和父字段添加一个示例输入&您的预期输出??simple select*from table不起作用?它起作用,但不是我想要的。基本上,select*from以列格式显示展平字段,以数组格式显示结构和数组,如[col a、col b、col c]。我的动机是生成自动查询或获取字段名及其字段类型和父字段hi Alex,感谢您的回复。很抱歉,这可能是个小问题。我有点困惑,在你的代码中我需要在哪里传递我的avro模式文件?@Teja这部分是data.schema.flatMapHi-Alex,谢谢你的回复。很抱歉,这可能是个小问题。我有点困惑,在您的代码中,我需要在哪里传递我的avro模式文件?@Teja是data.schema.flatMap部分
root
|-- identifier: struct (nullable = true)
|    |-- domain: string (nullable = true)
|    |-- id: string (nullable = true)
|    |-- version: long (nullable = true)
alternativeIdentifiers: array (nullable = true)
|    |    |-- element: struct (containsNull = true)
|    |    |    |-- identifier: struct (nullable = true)
|    |    |    |    |-- domain: string (nullable = true)
|    |    |    |    |-- id: string (nullable = true)
SELECT identifier.domain, identifier.id, identifier.version