Python df.columns给出了ValueError:in pyspark

Python df.columns给出了ValueError:in pyspark,python,pyspark,apache-spark-sql,Python,Pyspark,Apache Spark Sql,我是Pypark的新手。我在执行命令时出错 from pyspark.sql import SparkSession spark = SparkSession.builder.appName("basics").getOrCreate() df = spark.read.csv("data.csv",inferSchema=True,header=True) df.columns 我的数据有1000000行和50列。我得到以下错误 ValueError

我是Pypark的新手。我在执行命令时出错

from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("basics").getOrCreate()
df = spark.read.csv("data.csv",inferSchema=True,header=True)  
df.columns
我的数据有1000000行和50列。我得到以下错误

ValueError                                Traceback (most recent call last)
<ipython-input-71-b666bf274d0a> in <module>
----> 1 df.columns

~/anaconda3/lib/python3.7/site-packages/pyspark/sql/dataframe.py in columns(self)
    935         ['age', 'name']
    936         """
--> 937         return [f.name for f in self.schema.fields]
    938 
    939     @since(2.3)

~/anaconda3/lib/python3.7/site-packages/pyspark/sql/dataframe.py in schema(self)
    253         if self._schema is None:
    254             try:
--> 255                 self._schema = _parse_datatype_json_string(self._jdf.schema().json())
    256             except AttributeError as e:
    257                 raise Exception(

~/anaconda3/lib/python3.7/site-packages/pyspark/sql/types.py in _parse_datatype_json_string(json_string)
    867     >>> check_datatype(complex_maptype)
    868     """
--> 869     return _parse_datatype_json_value(json.loads(json_string))
    870 
    871 

~/anaconda3/lib/python3.7/site-packages/pyspark/sql/types.py in _parse_datatype_json_value(json_value)
    884         tpe = json_value["type"]
    885         if tpe in _all_complex_types:
--> 886             return _all_complex_types[tpe].fromJson(json_value)
    887         elif tpe == 'udt':
    888             return UserDefinedType.fromJson(json_value)

~/anaconda3/lib/python3.7/site-packages/pyspark/sql/types.py in fromJson(cls, json)
    575     @classmethod
    576     def fromJson(cls, json):
--> 577         return StructType([StructField.fromJson(f) for f in json["fields"]])
    578 
    579     def fieldNames(self):

~/anaconda3/lib/python3.7/site-packages/pyspark/sql/types.py in <listcomp>(.0)
    575     @classmethod
    576     def fromJson(cls, json):
--> 577         return StructType([StructField.fromJson(f) for f in json["fields"]])
    578 
    579     def fieldNames(self):

~/anaconda3/lib/python3.7/site-packages/pyspark/sql/types.py in fromJson(cls, json)
    432     def fromJson(cls, json):
    433         return StructField(json["name"],
--> 434                            _parse_datatype_json_value(json["type"]),
    435                            json["nullable"],
    436                            json["metadata"])

~/anaconda3/lib/python3.7/site-packages/pyspark/sql/types.py in _parse_datatype_json_value(json_value)
    880             return DecimalType(int(m.group(1)), int(m.group(2)))
    881         else:
--> 882             raise ValueError("Could not parse datatype: %s" % json_value)
    883     else:
    884         tpe = json_value["type"]

ValueError: Could not parse datatype: decimal(6,-8)
ValueError回溯(最近一次调用)
在里面
---->1 df.columns
列中的~/anaconda3/lib/python3.7/site-packages/pyspark/sql/dataframe.py(self)
935[“年龄”、“姓名”]
936         """
-->937返回[self.schema.fields中f的f.name]
938
939@自(2.3)
模式中的~/anaconda3/lib/python3.7/site-packages/pyspark/sql/dataframe.py(self)
253如果self.\u模式为无:
254尝试:
-->255 self.\u schema=\u parse\u datatype\u json\u string(self.\u jdf.schema().json())
256除属性错误为e外:
257提出例外(
~/anaconda3/lib/python3.7/site-packages/pyspark/sql/types.py in\u parse\u datatype\u json\u string(json\u string)
867>>>检查数据类型(复杂映射类型)
868     """
-->869返回_parse_datatype_json_值(json.loads(json_字符串))
870
871
~/anaconda3/lib/python3.7/site-packages/pyspark/sql/types.py in\u parse\u datatype\u json\u值(json\u值)
884 tpe=json_值[“类型”]
885如果所有复杂类型的tpe:
-->886返回_all_complex_types[tpe].fromJson(json_值)
887 elif tpe==“udt”:
888返回UserDefinedType.fromJson(json_值)
fromJson(cls,json)中的~/anaconda3/lib/python3.7/site-packages/pyspark/sql/types.py
575@classmethod
576 def fromJson(cls,json):
-->577返回StructType([StructField.fromJson(f)表示json[“fields”]]中的f)
578
579 def字段名(自身):
~/anaconda3/lib/python3.7/site-packages/pyspark/sql/types.py in(.0)
575@classmethod
576 def fromJson(cls,json):
-->577返回StructType([StructField.fromJson(f)表示json[“fields”]]中的f)
578
579 def字段名(自身):
fromJson(cls,json)中的~/anaconda3/lib/python3.7/site-packages/pyspark/sql/types.py
432 def fromJson(cls,json):
433返回StructField(json[“name”],
-->434解析数据类型json值(json[“type”]),
435 json[“可空”],
436 json[“元数据”])
~/anaconda3/lib/python3.7/site-packages/pyspark/sql/types.py in\u parse\u datatype\u json\u值(json\u值)
880返回十进制类型(int(m.group(1)),int(m.group(2)))
881其他:
-->882提升值错误(“无法分析数据类型:%s”%json\u值)
883其他:
884 tpe=json_值[“类型”]
ValueError:无法分析数据类型:decimal(6,-8)

有人能帮我理解为什么会出现这个错误以及如何克服这个错误吗?如果我是因为错误的模式而出现错误的,我如何为50列定义模式?TIA!

根据您的评论,使用
inferSchema=True
,这个未经测试的代码应该可以帮助您:

from pyspark.sql import SparkSession
from pyspark.sql.types import *

spark = SparkSession.builder.appName("basics").getOrCreate()
df = spark.read.csv("data.csv",inferSchema=True,header=True)  
for column_type in df.dtypes:
    if 'string' in column_type[1]:
        df = df.withColumn(column_type[0], df[column_type[0]].cast(StringType()))
    elif 'double' in column_type[1]:
        df = df.withColumn(column_type[0],df[column_type[0]].cast(DoubleType()))
    elif 'int' in column_type[1]:
        df = df.withColumn(column_type[0],df[column_type[0]].cast(IntegerType()))
    elif 'bool' in column_type[1]:
        df = df.withColumn(column_type[0], df[column_type[0]].cast(BooleanType()))
    elif 'decimal' in column_type[1]:
        df = df.withColumn(column_type[0],df[column_type[0]].cast(DoubleType()))
    # add as many condiitions as you need for types

df.schema

让我知道它是否为您做了,如果没有,我将测试并更新它

您能提供您正在编写的代码以及您如何创建df吗?我怀疑您的架构不正确,只有看到代码才能确认。@eladchen我修改了“我的问题”并添加了导入数据的代码。我可以理解错误是由错误的sc造成的hema,但是当我有很多列时,我如何编写模式?您可以尝试关闭
inferSchema
,然后删除它,
inferSchema
再次迭代数据并尝试自动确定模式,但不尝试。谢谢@eladchema关闭interSchema可以正常工作,但它正在转换所有列s转换为字符串。我添加了一个代码,可以帮助您修复自动模式转换。谢谢@Elad,但我得到了以下错误:我猜缺少一个右括号。错误是:文件“”,第6行df=df。withColumn(column_type[0],df[column_type[0]。转换(StringType())^SyntaxError:无效的语法您是对的,我忘记了
]
列类型[0]后面的结束括号,我修复了它。我已经尝试了关闭]。但仍然得到相同的错误。你能上传一个你一直在使用的数据样本吗?我会自己运行并查看。很抱歉,由于保密问题,我无法执行此操作。