2017-04-26 3 views
-1

私はinferSchemaを有効にすることでspark dfとしてcsvファイルを読み込もうとしていますが、fv_df.columnsを取得できません。以下はエラーメッセージですspark csvパッケージのinferSchema

>>> 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) 

私がスキーマを推論していない場合、私は列をフェッチしてさらに操作を行うことができます。私はなぜこれがこのように働いているのか理解できません。誰も私を説明できますか?

+0

inferSchemaの有無にかかわらず、 'fv_df.printSchema()'の出力は何ですか? – Pushkr

答えて

0

次回はサンプルデータを提供できるといいですね。どのようにあなたのcsvがどのように見えるか知っていなければなりません。あなたの質問については、あなたのcsvの列は常に小数ではないように見えます。 InferSchemaは最初の行を取り、あなたのケースではデータ型を割り当てますが、それはDecimalTypeですが、2行目にエラーが発生するようなテキストがある可能性があります。

スキーマを推論しないと、もちろん、すべてがStringTypeとしてキャストされるため、スキーマが推測されない場合は機能します。あなたの

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

もちろん、あなたがより多くのオプションを追加することができます。

2

私はこのような何か、あなたはむしろ「.CSV」より関数「.LOAD」を使用することをお勧め。そして、あなたは単にあなたが欲しい得ることができます。

data = sc.textFile(path_to_file) 

そして、ちょうど使用し、ヘッダー(列)を取得するには:

data.columns 

(列を取得するために)これを行う別の方法は、このようにそれを使用することです

data.first() 

開いていない状態でCSVファイルからスキーマを取得しようとしているようです。上記は、あなたがそれらを手に入れ、あなたが好きなものを操作するのに役立ちます。

注:

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

幸運:「.columns'あなたの 'SC' を使用するには、ように構成する必要があります!

関連する問題