2017-12-08 3 views
1

Ich will nicht eine Textdatei lesen, mag ich die Aktion über einen bestehenden Datenrahmen hatpyspark Split csv mit Leerzeichen in string - jupyter Notebook

mein Datenrahmen Text nur eine Spalte durchzuführen, wie eine Datei, "tabSeparator".

Es ist eine strukturierte Datei, mit 3 Spalten, Separator aRegister sind. Bei die Spalte hat einen eingebetteten Registerkarte, wird es in doppelten Anführungszeichen ("xxx xx")

Beispiel:

------------------------- 
col_0 
------------------------- 
c11 c12 c13 
c21 c22 c23 
"c 31" "c 32" c33 

Ich bin mit diesem regulären Ausdruck: I bin mit pyspark mit Jupyter Notebook

myre = '([\\t ]?(\\".*?\\"|[^\\t ]+))' 

df = textDF.withColumn("tmp", split(col("_c0"), myre))\ 
     .select(\ 
     col("tmp").getItem(0).alias("col_1"),\ 
     col("tmp").getItem(1).alias("col_2"),\ 
     col("tmp").getItem(2).alias("col_3") 
    ) 

Nicht sicher, ob das Problem mit dem regulären Ausdruck oder meine Art und Weise ist, um die Datei zu analysieren, aber ich kann keinen neuen Datenrahmen mit den drei Säulen analysiert, resultierenden auf erstellen:

------------------- 
|col_1|col_2|col_3| 
------+-----+------ 
| c11 | c12 | c13 | 
| c21 | c22 | c23 | 
| c 31| c 32| c 33| 
------------------- 

Antwort

-1

Offensichtlich ist das Problem, dass Sie haben, dass es zwei mögliche Trennzeichen gibt.

Mit DataFrames ist es sehr einfach, Dateien mit nur einem Trennzeichen zu laden, zum Beispiel Tabulatortrennzeichen, sie werden als CSV-Dateien betrachtet, aber anstelle eines Kommas ist es nur ein Tab.

In diesem speziellen Szenario würden Sie sie wie folgt lauten:.

yourDF = spark.read.option ("Trennzeichen", "\ t") csv ('/ tabSeparator /')

Aber Wenn Sie mehrere haben, glaube ich, dass die einzige Option ist, eine Regex zu verwenden. Sie könnten RDDs auch verwenden und eine längere Funktion schreiben und Karte verwenden.

+0

Ich habe bereits einen Datenrahmen mit nur einer Spalte! Die Frage war, wie man es analysiert und 3 Spalten erstellt. Sie können davon ausgehen, dass die Registerkarte das einzige Trennzeichen ist. Ich möchte die Datei nicht wie vorgeschlagen lesen, weil sie nicht existiert. –

+0

Danke für den Downvote, versuche nur zu helfen :) Wenn Sie den letzten Teil lesen, können Sie sehen, dass es eine Option für die Verwendung einer RDD und eine einfache Aufteilung nach Tab gibt, aber Sie können ein SerDe für die Anführungszeichen verwenden. – xmorera

0

Das ist nichts, was csv Leser nicht verarbeiten kann:

spark.read.option("delimiter", "\t").csv(path_to_file) 

In Spark-2.3 Sie auf bestehende Datenstruktur erfolgen kann verteilen:

df = spark.createDataFrame([ 
    'c11\tc12\tc13', 'c21\tc22\tc23', '"c\t31"\t"c\t32"\t"c\t33"' 
], "string").toDF("col_0") 


spark.read.option('delimiter', '\t').csv(df.rdd.map(lambda x: x.col_0)).show() 


# +----+----+----+ 
# | _c0| _c1| _c2| 
# +----+----+----+ 
# | c11| c12| c13| 
# | c21| c22| c23| 
# |c 31|c 32|c 33| 
# +----+----+----+ 

UDF mit csv könnte 3 in 2.2 mit Python arbeiten, aber es wird langsam:

from pyspark.sql.functions import udf 
import csv 

@udf("struct<c0:string,c1:string,c2:string>") 
def csv_(s): 
    try: 
     return next(csv.reader([s], delimiter="\t")) 
    except: pass 

df.select(csv_("col_0").alias("tmp")).select("tmp.*").show() 

# +----+----+----+ 
# | c0| c1| c2| 
# +----+----+----+ 
# | c11| c12| c13| 
# | c21| c22| c23| 
# |c 31|c 32|c 33| 
# +----+----+----+