databricks / spark-xml

XML data source for Spark SQL and DataFrames
Apache License 2.0
496 stars 224 forks source link

exception in explode with xml file #179

Closed shermilaguerra closed 5 years ago

shermilaguerra commented 7 years ago

I have xml file with alot parse, I able to use "explode" to get data xml. it show exeption. I read xml file data = sqlContext.read.format('com.databricks.spark.xml').options(rowTag='ARTIGOSPUBLICADOS').load("file:///home/cloudera/dayse2.XML") data.printSchema() root |-- ARTIGOPUBLICADO: struct (nullable = true) | |-- @ORDEM-IMPORTANCIA: string (nullable = true) | |-- @SEQUENCIA-PRODUCAO: long (nullable = true) | |-- AREAS-DO-CONHECIMENTO: struct (nullable = true) | | |-- AREA-DO-CONHECIMENTO-1: struct (nullable = true) | | | |-- #VALUE: string (nullable = true) | | | |-- @NOME-DA-AREA-DO-CONHECIMENTO: string (nullable = true) | | | |-- @NOME-DA-ESPECIALIDADE: string (nullable = true) | | | |-- @NOME-DA-SUB-AREA-DO-CONHECIMENTO: string (nullable = true) | | | |-- @NOME-GRANDE-AREA-DO-CONHECIMENTO: string (nullable = true) | | |-- AREA-DO-CONHECIMENTO-2: struct (nullable = true) | | | |-- #VALUE: string (nullable = true) | | | |-- @NOME-DA-AREA-DO-CONHECIMENTO: string (nullable = true) | | | |-- @NOME-DA-ESPECIALIDADE: string (nullable = true) | | | |-- @NOME-DA-SUB-AREA-DO-CONHECIMENTO: string (nullable = true) | | | |-- @NOME-GRANDE-AREA-DO-CONHECIMENTO: string (nullable = true) | | |-- AREA-DO-CONHECIMENTO-3: struct (nullable = true) | | | |-- #VALUE: string (nullable = true) | | | |-- @NOME-DA-AREA-DO-CONHECIMENTO: string (nullable = true) | | | |-- @NOME-DA-ESPECIALIDADE: string (nullable = true) | | | |-- @NOME-DA-SUB-AREA-DO-CONHECIMENTO: string (nullable = true) | | | |-- @NOME-GRANDE-AREA-DO-CONHECIMENTO: string (nullable = true) | |-- AUTORES: array (nullable = true) | | |-- element: struct (containsNull = true) | | | |-- #VALUE: string (nullable = true)

data.select(explode(Data.ARTIGOPUBLICADO)).collect()

it fails with exception:

cannot resolve 'explode(ARTIGOPUBLICADO)' due to data type mismatch: input to function explode should be array or map type, not StructType(StructField(@ORDEM-IMPORTANCIA,StringType,true), StructField(@SEQUENCIA-PRODUCAO,LongType,true), StructField(AREAS-DO-CONHECIMENTO,StructType(StructField(AREA-DO-CONHECIMENTO-1,StructType(StructField(#VALUE,StringType,true), StructField(@NOME-DA-AREA-DO-CONHECIMENTO,StringType,true), StructField(@NOME-DA-ESPECIALIDADE,StringType,true), StructField(@NOME-DA-SUB-AREA-DO-CONHECIMENTO,StringType,true), StructField(@NOME-GRANDE-AREA-DO-CONHECIMENTO,StringType,true)),true), StructField(AREA-DO-CONHECIMENTO-2,StructType(StructField(#VALUE,StringType,true), StructField(@NOME-DA-AREA-DO-CONHECIMENTO,StringType,true), StructField(@NOME-DA-ESPECIALIDADE,StringType,true), StructField(@NOME-DA-SUB-AREA-DO-CONHECIMENTO,StringType,true), StructField(@NOME-GRANDE-AREA-DO-CONHECIMENTO,StringType,true)),true), StructField(AREA-DO-CONHECIMENTO-3,StructType(StructField(#VALUE,StringType,true), StructField(@NOME-DA-AREA-DO-CONHECIMENTO,StringType,true), StructField(@NOME-DA-ESPECIALIDADE,StringType,true), StructField(@NOME-DA-SUB-AREA-DO-CONHECIMENTO,StringType,true), StructField(@NOME-GRANDE-AREA-DO-CONHECIMENTO,StringType,true)),true)),true), StructField(AUTORES,ArrayType(StructType(StructField(#VALUE,StringType,true), StructField(@NOME-COMPLETO-DO-AUTOR,StringType,true), StructField(@NOME-PARA-CITACAO,StringType,true), StructField(@NRO-ID-CNPQ,LongType,true), StructField(@ORDEM-DE-AUTORIA,LongType,true)),true),true), StructField(DADOS-BASICOS-DO-ARTIGO,StructType(StructField(#VALUE,StringType,true), StructField(@ANO-DO-ARTIGO,LongType,true), StructField(@DOI,StringType,true), StructField(@FLAG-DIVULGACAO-CIENTIFICA,StringType,true), StructField(@FLAG-RELEVANCIA,StringType,true), StructField(@HOME-PAGE-DO-TRABALHO,StringType,true), StructField(@IDIOMA,StringType,true), StructField(@MEIO-DE-DIVULGACAO,StringType,true), StructField(@NATUREZA,StringType,true), StructField(@PAIS-DE-PUBLICACAO,StringType,true), StructField(@TITULO-DO-ARTIGO,StringType,true), StructField(@TITULO-DO-ARTIGO-INGLES,StringType,true)),true), StructField(DETALHAMENTO-DO-ARTIGO,StructType(StructField(#VALUE,StringType,true), StructField(@FASCICULO,StringType,true), StructField(@ISSN,LongType,true), StructField(@LOCAL-DE-PUBLICACAO,StringType,true), StructField(@PAGINA-FINAL,LongType,true), StructField(@PAGINA-INICIAL,LongType,true), StructField(@SERIE,LongType,true), StructField(@TITULO-DO-PERIODICO-OU-REVISTA,StringType,true), StructField(@VOLUME,LongType,true)),true), StructField(PALAVRAS-CHAVE,StructType(StructField(#VALUE,StringType,true), StructField(@PALAVRA-CHAVE-1,StringType,true), StructField(@PALAVRA-CHAVE-2,StringType,true), StructField(@PALAVRA-CHAVE-3,StringType,true), StructField(@PALAVRA-CHAVE-4,StringType,true), StructField(@PALAVRA-CHAVE-5,StringType,true), StructField(@PALAVRA-CHAVE-6,StringType,true)),true));

how explode Struct??

Any thoughts? Very Thank for your help.

shermilaguerra commented 7 years ago

this is the xml file <?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>

``` Informática Básica Introdução à Computação 1 Introdução à Computação Introdução à Programação de Computadores Programação Orientada à Objetos 2 (Prática) Programação Lógica (Prática) Programação Orientada à Objetos 1 (Prática) Informática Básica Probabilidade e estatística Projeto de graduação 1 Algoritmos e estruturas de dados 1 Projeto e análise de algoritmos ```
HyukjinKwon commented 7 years ago

explode should be applied to ArrayType or MapType not against StructType.

shermilaguerra commented 7 years ago

is there any function to get data from xml with structType? I was thinking to work with XSD instead with XML. Is there a difference between working with XML and XSD file?

HyukjinKwon commented 7 years ago

@shermilaguerra Oh, yes, there is the issue here - https://github.com/databricks/spark-xml/issues/168

shermilaguerra commented 7 years ago

is there any function to get data from xml structType?

HyukjinKwon commented 7 years ago

You could just access, for example, selectExpr(ARTIGOPUBLICADO.@ORDEM-IMPORTANCIA).

shermilaguerra commented 7 years ago

I do not ge the data with selectExpr(ARTIGOPUBLICADO.@ORDEM-IMPORTANCIA). you can tell me? In spark-xml reads the xml Datafram in front of the columns why it adds "@"??