我试图通过启用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)
但是,如果我没有推断出Schema,那么我可以获取列并进行进一步的操作。我无法理解为什么这样做。任何人都可以解释我。
答案 0 :(得分:2)
我建议你使用功能&#39; .load&#39;而不是&#39; .csv&#39;,像这样:
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文件中获取你的架构而不打开它!以上应该可以帮助你获得它们,从而操纵你喜欢的任何东西。
注意:使用&#39; .columns&#39;你的sc&#39;应配置为:
spark = SparkSession.builder \
.master("yarn") \
.appName("experiment-airbnb") \
.enableHiveSupport() \
.getOrCreate()
sc = SQLContext(spark)
祝你好运!
答案 1 :(得分:1)
请尝试下面的代码,这将与标题一起推断出模式
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()
答案 2 :(得分:0)
如果您下次可以提供一些样本数据,那将是一件好事。我们应该怎么知道你的csv是怎样的。关于您的问题,看起来您的csv列始终不是小数。 InferSchema获取第一行并分配数据类型,在您的情况下,它是DecimalType但在第二行中您可能有文本以便发生错误。
如果您没有推断出架构,那么它当然会起作用,因为所有内容都将被转换为StringType。