2017-04-26 1 views
-1

Ich versuche, eine CSV-Datei als Funken df zu lesen, indem Sie inferSchema aktivieren, aber dann bin ich nicht in der Lage, die fv_df.columns zu bekommen. unten ist die FehlermeldunginferSchema in Spark-CSV-Paket

>>> fv_df = spark.read.option("header", "true").option("delimiter", "\t").csv('/home/h212957/FacilityView/datapoints_FV.csv', inferSchema=True) 
>>> fv_df.columns 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/home/h212957/spark/python/pyspark/sql/dataframe.py", line 687, in columns 
    return [f.name for f in self.schema.fields] 
    File "/home/h212957/spark/python/pyspark/sql/dataframe.py", line 227, in schema 
    self._schema = _parse_datatype_json_string(self._jdf.schema().json()) 
    File "/home/h212957/spark/python/pyspark/sql/types.py", line 894, in _parse_datatype_json_string 
    return _parse_datatype_json_value(json.loads(json_string)) 
    File "/home/h212957/spark/python/pyspark/sql/types.py", line 911, in _parse_datatype_json_value 
    return _all_complex_types[tpe].fromJson(json_value) 
    File "/home/h212957/spark/python/pyspark/sql/types.py", line 562, in fromJson 
    return StructType([StructField.fromJson(f) for f in json["fields"]]) 
    File "/home/h212957/spark/python/pyspark/sql/types.py", line 428, in fromJson 
    _parse_datatype_json_value(json["type"]), 
    File "/home/h212957/spark/python/pyspark/sql/types.py", line 907, in _parse_datatype_json_value 
    raise ValueError("Could not parse datatype: %s" % json_value) 
ValueError: Could not parse datatype: decimal(7,-31) 

aber wenn ich weitere Operationen nicht das Schema ableiten, als ich in der Lage bin, um die Spalten zu holen und zu tun. Ich kann nicht verstehen, warum das so funktioniert. Kann mir bitte jemand erklären.

+0

Was ist Ausgabe von 'fv_df.printSchema()' mit und ohne inferSchema? – Pushkr

Antwort

0

Es wäre gut, wenn Sie beim nächsten Mal einige Beispieldaten zur Verfügung stellen können. Wie sollen wir wissen, wie Ihr CSV aussieht? In Bezug auf Ihre Frage sieht es so aus, dass Ihre CSV-Spalte nicht immer eine Dezimalzahl ist. InferSchema nimmt die erste Zeile und weist einen Datentyp zu, in Ihrem Fall ist es ein DecimalType, aber dann in der zweiten Zeile haben Sie möglicherweise einen Text, so dass der Fehler auftreten würde.

Wenn Sie das Schema nicht ableiten, dann würde es natürlich funktionieren, da alles als StringType umgewandelt wird.

2

Ich schlage vor, Sie verwenden die Funktion ‚.load‘ und nicht ‚.csv‘, etwa so:

data = sc.read.load(path_to_file, 
        format='com.databricks.spark.csv', 
        header='true', 
        inferSchema='true').cache() 

Sie natürlich können Sie weitere Optionen hinzuzufügen. Dann können Sie einfach erhalten Sie wollen:

data.columns 

Ein anderer Weg, dies zu tun (um die Spalten zu bekommen) ist es auf diese Weise nutzen:

data = sc.textFile(path_to_file) 

Und die Header (Spalten) nur um verwenden

Sieht aus wie Sie versuchen, Ihr Schema aus Ihrer CSV-Datei zu bekommen, ohne es zu öffnen! Das obige sollte dir helfen, sie zu bekommen und damit zu manipulieren, was immer du willst.

Hinweis:

spark = SparkSession.builder \ 
      .master("yarn") \ 
      .appName("experiment-airbnb") \ 
      .enableHiveSupport() \ 
      .getOrCreate() 
sc = SQLContext(spark) 

Viel Glück: Ihr 'sc' ‚.columns' zu verwenden, sollte so konfiguriert werden!

Verwandte Themen