Pyspark spark csv包中的推断模式
我试图通过启用inferSchema将csv文件读取为spark df,但无法获取fv_df.columns。下面是错误消息Pyspark spark csv包中的推断模式,pyspark,spark-csv,Pyspark,Spark Csv,我试图通过启用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 Traceba
>>> 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=spark.read.option(“header”、“true”).option(“delimiter”、“t”).csv('/home/h212957/FacilityView/datapoints_fv.csv',inferSchema=true)
>>>fv_df.列
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/home/h212957/spark/python/pyspark/sql/dataframe.py”,第687行,列中
返回[self.schema.fields中f的f.name]
模式中的文件“/home/h212957/spark/python/pyspark/sql/dataframe.py”,第227行
self.\u schema=\u parse\u datatype\u json\u string(self.\u jdf.schema().json())
文件“/home/h212957/spark/python/pyspark/sql/types.py”,第894行,在_parse_datatype_json_字符串中
返回_parse_datatype_json_值(json.loads(json_字符串))
文件“/home/h212957/spark/python/pyspark/sql/types.py”,第911行,在_parse_datatype_json_值中
返回所有复杂类型[tpe].fromJson(json值)
fromJson格式的文件“/home/h212957/spark/python/pyspark/sql/types.py”,第562行
返回StructType([StructField.fromJson(f)表示json[“fields”]]中的f)
文件“/home/h212957/spark/python/pyspark/sql/types.py”,第428行,fromJson格式
_解析_数据类型_json_值(json[“类型]),
文件“/home/h212957/spark/python/pyspark/sql/types.py”,第907行,在_parse_datatype_json_值中
raise VALUERROR(“无法分析数据类型:%s”%json\u值)
ValueError:无法分析数据类型:decimal(7,-31)
但是,如果我不推断模式,那么我就能够获取列并执行进一步的操作。我无法理解为什么这样做。谁能给我解释一下。如果你下次能提供一些样本数据就好了。我们如何知道您的csv是什么样子。关于您的问题,看起来您的csv列并非始终是十进制的。InferSchema获取第一行并分配一个数据类型,在您的情况下,它是一个,但是在第二行中,您可能会有一个文本,因此会发生错误
当然,如果您不推断模式,那么它将起作用,因为所有内容都将转换为StringType。我建议您使用函数“.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)
祝你好运 请尝试下面的代码,这将推断出模式和标题
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()
fv_df.printSchema()
的输出是什么?