2017-06-22 2 views
2

ich zum Lesen von CSV-Datei Daten aus einer Angabe Bereich einen Funken Job verwende und diese Daten in HDFS Bewältigungs folgende Codezeile:CSV-Daten exportiert/kopiert HDFS in seltsamen Format gehen

val conf = new SparkConf().setAppName("WCRemoteReadHDFSWrite").set("spark.hadoop.validateOutputSpecs", "true"); 

val sc = new SparkContext(conf) 
val rdd = sc.textFile(source) 

rdd.saveAsTextFile(destination) 

CSV-Datei ist mit Daten in folgendem Format:

ctid, C3UID, Region, Produkt, KeyWord

1,1004634181441040000, Osten, mobile, NA

2,1004634181441040000, West, Tablette, NA

während, wenn Daten gehen in HDFS es in folgendem Format lautet:

CTID, C3UID, eine Region, Produkt, KeyWord

1,1.00463 E + 18, Osten, mobile, NA

2,1.00463E + 18, West, Tablette, NA

Ich kann keinen stichhaltigen Grund dafür finden. Jede Art von Hilfe wäre willkommen.

Grüße, Bhupesh

Antwort

3

Was passiert, ist, dass, weil Ihre C3UID eine große Zahl ist, wird es als Doppel analysiert wird und dann in Standard-Doppel Notation gespeichert wird. Sie müssen das Schema korrigieren und sicherstellen, dass Sie die zweite Spalte entweder als Long, BigDecimal oder String lesen. Dann ändert sich die String-Darstellung nicht.

+0

Vielen Dank für Ihre Antwort @Rick Moritz, wenn Sie sagen, dass ich mein Schema beheben sollte, bedeutet das, ich sollte Spark Dataframe API verwenden Lesen von Daten vom freigegebenen Speicherort und Schreiben dieser Daten in HDFS? –

+0

@ChauhanB: Nicht unbedingt - aber es kann helfen. Ein guter Ausgangspunkt wäre, die Typen zu überprüfen, die sich in der RDD befinden - die Erkennung von Double kann bereits in sc.textFile oder im Speicherschritt geschehen. Wenn Sie wirklich nur die Daten kopieren möchten, sollten Sie auch die HDFS-API anstelle von/in Spark verwenden. Wenn Sie die Daten in der Folgeverarbeitung erneut verwenden möchten, ist die Verwendung von Spark eine bessere Option - für diese Art von Daten ist die DataFrame-API besser geeignet, daher würde ich dies empfehlen. –

+0

Ich möchte für Spark-API gehen, wie ich eine Art von Datenvernunft, Datenreinigung über die Zeilendaten vor dem Speichern in HDFS tun möchte. Ich habe auch andere Tools wie Apache Nifi untersucht, aber ich möchte die Kosten für zusätzliche Cluster für Apache Nifi vermeiden. Ich möchte meinen vorhandenen Spark- und HDFS-Cluster nutzen, in dem meine Hauptanwendung nach dem Laden von Daten in HDFS ausgeführt werden würde. Siehst du es als einen guten Ansatz? Sind Sie der Meinung, dass die Verwendung von Spark für das On-Boarding von Daten eine gute Idee ist [wo ich die Daten bereinigen würde, bevor Sie Daten in HDFS speichern? –

0

Manchmal könnte Ihre CSV-Datei auch der Schuldige sein. Öffnen Sie die CSV-Datei NICHT in Excel, da Excel diese großen numerischen Werte in ein exponentielles Format umwandeln kann. Sobald Sie also einen Funke-Job zum Importieren von Daten in hdfs verwenden, wird er im String-Format angezeigt.

Seien Sie also sehr sicher, dass Ihre Daten in CSV nie in Excel geöffnet werden sollten, bevor Sie mit Hilfe von Spark Job in hdfs importieren. Wenn Sie wirklich den Inhalt Ihres Excel sehen möchten, verwenden Sie entweder Notepad ++ oder ein anderes Texteditor-Tool

Verwandte Themen