2016-07-05 4 views
3

So deaktivieren Sie die wissenschaftliche Notation beim Lesen der XML-Datei mit Databrick Spark-XML-Bibliothek. Hier ist Szenario meiner XML-Datei enthält numerischen Wert mit Platz wie dieseSo deaktivieren Sie die wissenschaftliche Notation in spark-xml

<V1>42451267 </V1> 

und was ich bin immer 4.2451267E7 statt 42451267

Wie kann ich es beheben

Meinen Code und xml Datei sind unter

val xmlLocation = "sampleFile/xml/sample.xml" 
val rootTag = "RTS" 
val rowTag = "COLUMNTYPE" 
val sqlContext = MySparkDriver.getSqlContext(). 
    read.format("com.databricks.spark.xml") 
if (rootTag != null && rootTag.size == 0) 
    sqlContext.option("rootTag", rootTag) 
sqlContext.option("rowTag", rowTag) 
val xmlDF = sqlContext.load(xmlLocation) 
xmlDF.show(false) 

Ausgang

[WrappedArray(4232323.0, 4.2451267E7),21-11-2000 01:04:34,NTS,212212112,100.0,100.0] 

erwartet

[WrappedArray(4232323, 42451267),21-11-2000 01:04:34,NTS,212212112,100.0000,100.0000] 

XML-Datei

<RTS> 
<COLUMNTYPE> 
    <D1> 
     <V1>4232323</V1> 
     <V1>42451267 </V1> 
     <V2>21-11-2000 01:04:34</V2> 
     <V3>NTS</V3> 
     <V4>212212112</V4> 
     <V7>100.0000</V7> 
     <V8>100.0000 </V8> 

    </D1> 
</COLUMNTYPE> 
</RTS> 

Jede Hilfe sehr geschätzt werden würde.

+0

Wenn Sie eine bestimmte Formatierung wollen Zahlen nicht verwenden. Verwenden Sie Zeichenfolgen mit dem gewünschten Format. – zero323

+0

danke für die Antwort, aber wie kann ich entscheiden, Datentyp – MD51

+0

@ zero323 PLZ mir helfen – MD51

Antwort

2

IsLong Funktion der TypeCast Klasse nicht in der Lage Datentyp vorherzusagen, weil Ihr Wert „42451267“ Raum enthalten

Wenn Sie jedoch als ein Long-Wert behandelt möchten, dass Ihre eigenen benutzerdefinierten Schema definiert, wobei " V1" Spaltendatentyp ist String

val xmlLocation = "sampleFile/xml/sample.xml" 
val rootTag = "RTS" 
val rowTag = "COLUMNTYPE" 
val sqlContext = MySparkDriver.getSqlContext(). 
    read.format("com.databricks.spark.xml") 
if (rootTag != null && rootTag.size == 0) 
    sqlContext.option("rootTag", rootTag) 
sqlContext.option("rowTag", rowTag) 

Benutzerdefinierte Schema

val customSchema = StructType(Array(
    StructField("D1", StructType(
    Seq(StructField("V1", ArrayType(StringType, true), true), 
     StructField("V2", StringType, true), 
     StructField("V3", StringType, true), 
     StructField("V4", LongType, true), 
     StructField("V7", DoubleType, true), 
     StructField("V8", DoubleType, true))), true))) 
sqlContext.schema(customSchema) 

Erstellen der UDF für Trimmwerte

import org.apache.spark.sql.functions._ 
val toTrim = udf((xs: Seq[String]) => xs.map(_.trim())) 

gelten UDF und Typumwandlung zu lange

val xmlDF = sqlContext.load(xmlLocation).select(struct(
    toTrim(col("D1.V1")).cast("array<long>").alias("V1"), 
    col("D1.V2"), col("D1.V3"), col("D1.V4"), col("D1.V7"), col("D1.V8")) 
    .alias("D1")) 
xmlDF.printSchema 
xmlDF.show(false) 
3

Ich bin nicht ganz sicher, was ist der Punkt, der all das, aber ich sehe im Grunde zwei Möglichkeiten hier:

  • , wenn alle Felder so groß ganze Zahl interpretiert werden können oder Du Ziel ist es, diese als ganze Zahlen zu haben, Sie verwenden Art Casting, was mehr geben sollte oder weniger, was Sie ohne signifikanten Verlust an Funktionalität wollen:

    case class D1(
        v1: Seq[Double], v2: String, v3: String, v4: Long, v7: Double, v8: Double 
    ) 
    case class ColumnType(d1: D1) 
    
    val df = Seq(ColumnType(D1(
        Seq(4232323, 42451267), 
        "21-11-2000 01:04:34", 
        "NTS", 
        212212112, 
        100.0000, 
        100.0000 
    ))).toDF() 
    
    df.select(struct(
        $"d1.v1".cast("array<bigint>").alias("v1"), 
        $"d1.v2", $"d1.v3", $"d1.v4", $"d1.v7", $"d1.v8" 
    ).alias("d1")) 
    
  • , wenn Sie eine bestimmte Anzahl Format aus Darstellungsgründen möchten Sie Daten auf ein Array von formated Strings umwandeln kann:

    val toFormatted = udf((xs: Seq[Double]) => xs.map(x => f"$x%4.0f")) 
    
    df.select(struct(
        toFormatted($"d1.v1").alias("v1"), 
        $"d1.v2", $"d1.v3", $"d1.v4", $"d1.v7", $"d1.v8" 
    ).alias("d1")) 
    
Verwandte Themen