spark csv 包中的 inferSchema

Posted

技术标签:

【中文标题】spark csv 包中的 inferSchema【英文标题】:inferSchema in spark csv package 【发布时间】:2017-04-26 08:24:20 【问题描述】:

我正在尝试通过启用 inferSchema 将 csv 文件作为 spark df 读取,但随后无法获取 fv_df.columns。以下是错误信息

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

但是,如果我不推断架构,则我能够获取列并进行进一步的操作。我无法理解为什么以这种方式工作。谁能给我解释一下。

【问题讨论】:

fv_df.printSchema() 有和没有 inferSchema 的输出是什么? 【参考方案1】:

我建议你使用函数'.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)

祝你好运!

【讨论】:

【参考方案2】:

请尝试下面的代码,这会推断出架构和标题

from pyspark.sql import SparkSession
spark=SparkSession.builder.appName('operation').getOrCreate()
df=spark.read.csv("C:/LEARNING//Spark_DataFrames/stock.csv ",inferSchema=True, header=True)

df.show()

【讨论】:

【参考方案3】:

如果下次能提供一些样本数据就好了。我们应该如何知道您的 csv 的外观。关于您的问题,您的 csv 列似乎一直不是小数。 InferSchema 获取第一行并分配一个数据类型,在您的情况下,它是 DecimalType,但是在第二行中您可能有一个文本,这样就会发生错误。

如果您不推断架构,那么当然,它会起作用,因为所有内容都将被转换为 StringType。

【讨论】:

以上是关于spark csv 包中的 inferSchema的主要内容,如果未能解决你的问题,请参考以下文章

如何为 spark-csv 提供 parserLib 和 inferSchema 选项

将读取文件的架构存储到 spark scala 中的 csv 文件中

Spark 选项:inferSchema vs header = true

Spark读取一个文件夹中的所有csv文件

改进此pyspark连接的最佳方法

在 read.csv 期间使用限制的 Spark 推断架构