Estoy tratando de escribir dataframe a text archivo. Si un archivo contiene una sola columna, entonces soy capaz de escribir en un archivo de texto. Si el archivo contiene varias columnas, a continuación, I a frente a algunas de error

Origen de datos de texto sólo admite una sola columna, y tiene 2
columnas.

object replace {

  def main(args:Array[String]): Unit = {

    Logger.getLogger("org").setLevel(Level.ERROR)

    val spark = SparkSession.builder.master("local[1]").appName("Decimal Field Validation").getOrCreate()

    var sourcefile = spark.read.option("header","true").text("C:/Users/phadpa01/Desktop/inputfiles/decimalvalues.txt")

     val rowRDD = sourcefile.rdd.zipWithIndex().map(indexedRow => Row.fromSeq((indexedRow._2.toLong+1) +: indexedRow._1.toSeq)) //adding prgrefnbr               
                         //add column for prgrefnbr in schema
     val newstructure = StructType(Array(StructField("PRGREFNBR",LongType)).++(sourcefile.schema.fields))

     //create new dataframe containing prgrefnbr

     sourcefile = spark.createDataFrame(rowRDD, newstructure)
     val op= sourcefile.write.mode("overwrite").format("text").save("C:/Users/phadpa01/Desktop/op")

  }

}

4 Comentarios

  1. 4

    usted puede convertir el dataframe a la rdd y encubiertas de la fila a la cadena y escribir la última línea como

     val op= sourcefile.rdd.map(_.toString()).saveAsTextFile("C:/Users/phadpa01/Desktop/op")

    Editado

    Como @philantrovert y @Pravinkumar han señalado que la anterior anexar [ y ] en el archivo de salida, lo cual es cierto. La solución sería replace con empty carácter como

    val op= sourcefile.rdd.map(_.toString().replace("[","").replace("]", "")).saveAsTextFile("C:/Users/phadpa01/Desktop/op")

    Uno puede incluso utilizar regex

    • Creo que esto va a agregar [ y ] en ambos extremos de cada fila.
    • pero su añadiendo «[ ]» para cada registro para cada línea.por ejemplo:[2,12.2,12.2]
    • sí que se puede reemplazar con vacío. permítanme actualización de la respuesta
    • sí, yo soy capaz de leer, pero «EURO» signo de la lectura como una garbej valor.valor de entrada = €|€,valor de salida= «�|�». después de la conversión
    • Estoy adivinando su serialización y deserialización problema . Esta puede ser otra pregunta, en tanto . ¿Qué dice @PravinkumarHadpad?
    • Sí Ramesh pero no tengo acceso a plantear una pregunta más. He límite de 2 por semana. Eso es una gran ayuda si usted sugerir algo.
    • no es capaz de leer símbolo del euro de valor
    • Acabo de probar poniendo símbolo en el archivo de entrada y se llegó a la salida sin problema. ¿Cómo estás viendo el archivo? se puede ver el símbolo en el archivo de entrada?

  2. 1

    Puede guardar como texto CSV archivo (.format("csv"))

    El resultado será un archivo de texto en formato CSV, cada columna estarán separados por una coma.

    val op = sourcefile.write.mode("overwrite").format("csv").save("C:/Users/phadpa01/Desktop/op")

    Más información se puede encontrar en la chispa guía de programación

    • Quiero extensión de archivo debe ser .txt por encima de la solución de la extensión de archivo es .csv
    • ¿Cómo desea que cada fila para ser impreso? Separados por comas o algo más?
    • ¿por qué te importa si la salida de la extensión de archivo es .txt o .csv?
    • su anexando comillas dobles para los valores disponibles en dataframes antes de añadir seq número.por ejemplo:- 3,»12.20,12.2-» pero quiero archivo de salida de datos como 3,12.20,12.2
    • básicamente quiero comillas dobles gratis el archivo es por eso que quiero guardar en archivo de texto.
  3. 1

    Yo uso databricks api para guardar mis DF salida en un archivo de texto.

    myDF.write.format("com.databricks.spark.csv").option("header", "true").save("output.csv")
  4. 1

    Me gustaría recomendar el uso de csv o otros formatos delimitados. El siguiente es un ejemplo con la mayoría de los conciso/elegante manera de escribir .tsv en la Chispa de 2+

    val tsvWithHeaderOptions: Map[String, String] = Map(
      ("delimiter", "\t"), //Uses "\t" delimiter instead of default ","
      ("header", "true"))  //Writes a header record with column names
    
    df.coalesce(1)         //Writes to a single file
      .write
      .mode(SaveMode.Overwrite)
      .options(tsvWithHeaderOptions)
      .csv("output/path")
    • Esto no escribir un archivo tsv pero un csv
    • NOTA el "delimiter", "\t" opción. Debería funcionar (a mi me funciona)
    • Tengo exactamente el mismo código en la Chispa de la 2.4 y escribe un archivo CSV. Por otra parte, no he podido encontrar una solución a esto.
    • A mi me funciona en 2.3. Me pregunto si algo está pasando aquí, aunque…

Dejar respuesta

Please enter your comment!
Please enter your name here