2017-04-26 30 views
-1

我想通過啓用inferSchema來讀取csv文件作爲spark df,但後來無法獲取fv_df.columns。下面是錯誤消息inferSchema在spark csv包中

>>> 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,但在第二行中你可能有一個文本,以便發生錯誤。

如果你不推導模式,那麼當然,它會工作,因爲一切都會被轉換爲StringType。

2

我建議你使用的功能「.load」而不是'.csv格式,這樣的事情:

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

你當然可以添加更多的選擇。然後,你可以簡單地得到你想要的:

data.columns 

這樣(得到列)的另一種方法是使用這種方式:

data = sc.textFile(path_to_file) 

而獲得標題(列)只使用

data.first() 

看起來你試圖從你的csv文件中獲取你的模式而不打開它!以上應該可以幫助你獲得它們,並因此操縱你喜歡的任何東西。

注:使用」 .columns'你的 'SC' 應配置爲:

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

祝你好運!