2016-12-21 2 views
1

Ich bin nicht sehr gut mit Scala (ich bin eher ein R-Süchtiger) Ich möchte den WrappedArray-Element Inhalt (siehe unten sqlDf.show()) in zwei Zeilen mit Scala in spark-shell anzeigen. Ich habe die explode() Funktion versucht, konnte aber nicht weiter bekommen ...Spark SQL DataFrame pretty print

scala> val sqlDf = spark.sql("select t.articles.donneesComptablesArticle.taxes from dau_temp t") 
sqlDf: org.apache.spark.sql.DataFrame = [taxes: array<array<struct<baseImposition:bigint,codeCommunautaire:string,codeNatureTaxe:string,codeTaxe:string,droitCautionnable:boolean,droitPercu:boolean,imputationCreditCautionne:boolean,montantLiquidation:bigint,quotite:double,statutAi2:boolean,statutDeLiquidation:string,statutRessourcesPropres:boolean,typeTaxe:string>>>] 

scala> sqlDf.show 
16/12/21 15:13:21 WARN util.Utils: Truncated the string representation of a plan since it was too large. This behavior can be adjusted by setting 'spark.debug.maxToStringFields' in SparkEnv.conf. 
+--------------------+ 
|    taxes| 
+--------------------+ 
|[WrappedArray([12...| 
+--------------------+ 


scala> sqlDf.printSchema 
root 
|-- taxes: array (nullable = true) 
| |-- element: array (containsNull = true) 
| | |-- element: struct (containsNull = true) 
| | | |-- baseImposition: long (nullable = true) 
| | | |-- codeCommunautaire: string (nullable = true) 
| | | |-- codeNatureTaxe: string (nullable = true) 
| | | |-- codeTaxe: string (nullable = true) 
| | | |-- droitCautionnable: boolean (nullable = true) 
| | | |-- droitPercu: boolean (nullable = true) 
| | | |-- imputationCreditCautionne: boolean (nullable = true) 
| | | |-- montantLiquidation: long (nullable = true) 
| | | |-- quotite: double (nullable = true) 
| | | |-- statutAi2: boolean (nullable = true) 
| | | |-- statutDeLiquidation: string (nullable = true) 
| | | |-- statutRessourcesPropres: boolean (nullable = true) 
| | | |-- typeTaxe: string (nullable = true) 

scala> val sqlDfTaxes = sqlDf.select(explode(sqlDf("taxes"))) 
sqlDfTaxes: org.apache.spark.sql.DataFrame = [col: array<struct<baseImposition:bigint,codeCommunautaire:string,codeNatureTaxe:string,codeTaxe:string,droitCautionnable:boolean,droitPercu:boolean,imputationCreditCautionne:boolean,montantLiquidation:bigint,quotite:double,statutAi2:boolean,statutDeLiquidation:string,statutRessourcesPropres:boolean,typeTaxe:string>>] 

scala> sqlDfTaxes.show() 
16/12/21 15:22:28 WARN util.Utils: Truncated the string representation of a plan since it was too large. This behavior can be adjusted by setting 'spark.debug.maxToStringFields' in SparkEnv.conf. 
+--------------------+ 
|     col| 
+--------------------+ 
|[[12564,B00,TVA,A...| 
+--------------------+ 

Die „lesbar“ Inhalt sieht wie folgt aus (THIS MY GOA IS L: eine klassische Zeile x Spalten Strukturanzeige mit Header) :

codeTaxe codeCommunautaire baseImposition quotite montantLiquidation statutDeLiquidation 
A445    B00   12564 20.0    2513     C 
U165    A00   12000  4.7    564     C 
codeNatureTaxe typeTaxe statutRessourcesPropres statutAi2 imputationCreditCautionne 
TVA ADVAL     FALSE  TRUE      FALSE 
DD ADVAL     TRUE  FALSE      TRUE 
droitCautionnable droitPercu 
FALSE  TRUE 
FALSE  TRUE 

und die Klasse jeder Zeile (fand es R-Paket mit sparklyr) ist:

<jobj[100]> 
    class org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema 
    [12564,B00,TVA,A445,false,true,false,2513,20.0,true,C,false,ADVAL] 

[[1]][[1]][[2]] 
<jobj[101]> 
    class org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema 
    [12000,A00,DD,U165,false,true,true,564,4.7,false,C,true,ADVAL] 
+1

'sqlDf.show (gestutzt = false)' wäre ein guter Ort sein, Start ... –

+0

@Tzach Zohar: Danke! Sie haben tatsächlich meine Frage "print pretty" beantwortet. Nun, was ich wirklich gemeint habe, war, eine klassische "rows x columns" -Struktur mit den Headern zu bekommen (wie in meinem "lesbaren" Inhalt oben) – guzu92

Antwort

2

Sie ex können plode auf jeder Spalte:

val flattenedtaxes = sqlDf.withColumn("codeCommunautaire", org.apache.spark.sql.functions.explode($"taxes. codeCommunautaire")) 

Danach Ihre flattenedtaxes 2 Spalten Steuern haben neue Spalte (alle Spalten wie) codeCommunautaire

+0

Vielen Dank für Ihren Vorschlag, ich habe den folgenden Fehler bekommen: 'org .apache.spark.sql.AnalysisException: kann '' taxes '[' codeCommunautaire ']' aufgrund von Datentyp-Mismatch nicht auflösen: Argument 2 erfordert einen integralen Typ, '' codeCommunautaire '' ist jedoch vom String-Typ. Ich werde weiter nachforschen , aber wenn Sie eine schnelle Lösung haben, zögern Sie bitte nicht! – guzu92

+0

Ich kann Ihnen auch die (Dummy) JSON-Datei senden, danke. – guzu92

+0

senden Sie bitte, so dass ich in es schauen kann, geben Sie Arbeitscode – toofrellik