【问题标题】:AttributeError: 'str' object has no attribute 'name' PySparkAttributeError:“str”对象没有属性“name”PySpark
【发布时间】:2020-04-23 20:05:44
【问题描述】:

我已创建列表并尝试将其分配给 StructType() 但出现错误:

AttributeError: 'str' object has no attribute 'name'

我的代码:

from pyspark.sql import SparkSession
import logging
from pyspark.sql.types import *
from pyspark.sql.functions import to_timestamp
from pyspark.sql.functions import udf
from pyspark.sql.functions import lit
from pyspark.sql.functions import year, month, dayofmonth
from pyspark.context import SparkContext
from pyspark.sql import SQLContext
import argparse

logging.basicConfig(level=logging.INFO,filename = 'parquet.log')
logger = logging.getLogger(__name__)

parser = argparse.ArgumentParser()
parser.add_argument('--schema_py', '--list', nargs='+', required=True, dest='schema_py', help='Scheam def')

args = parser.parse_args()

schemaField = args.schema_py
print(type(schemaField))   #It will print <class 'list'>

schema = StructType(schemaField) # On this line facing issue
print(type(schema))

输出

$ python tst.py --schema_py 'StructField('col1', StringType(), True),StructField('col2', StringType(), True),StructField('col3', StringType(), True),StructField('col4', StringType(), True),'

<class 'list'>
Traceback (most recent call last):
  File "brrConvertParquet.py", line 41, in <module>
    schema = StructType(schemaField)
  File "/home/sysbrrd/anaconda3/lib/python3.6/site-packages/pyspark/sql/types.py", line 484, in __init__
    self.names = [f.name for f in fields]
  File "/home/sysbrrd/anaconda3/lib/python3.6/site-packages/pyspark/sql/types.py", line 484, in <listcomp>
    self.names = [f.name for f in fields]
AttributeError: 'str' object has no attribute 'name'

请帮助我了解这里出了什么问题。

【问题讨论】:

    标签: python python-3.x pyspark


    【解决方案1】:

    我看到的问题是:

    1. 您正在将str 传递给StructType() 调用,而不是[StructField(),] 的列表,或者因为您有nargs='+',所以您可能正在传递一个字符串列表。 IE。 ["StructField('col1', StringType(), True)", "StructField('col2', StringType(), True)", "StructField('col3', StringType(), True)", "StructField('col4', StringType(), True)"]
    2. 如果您确实希望将字段作为 cmd arg 接收,那么您应该考虑验证此 arg 并将其转换为所需的 python 类型。您可以查看jsonpickleevalexec

    除此之外,其他一切都应该工作。

    self.names = [f.name for f in fields] 中断是因为fieldsstr 而不是StructField 的列表,如果它是StructField 的列表正如预期的那样,f.name 调用应该可以正常工作:-)

    我希望这会有所帮助。

    【讨论】:

    • :- 感谢您的回答!我能够对此进行排序,问题与您在此处解释的相同。由于我传递的数据类型是字符串格式,所以我已将其类型转换为所需的 pyspark 数据类型并且它有效。
    • @SwapnilM 如果答案是正确的并且它描述了您遇到的问题的解决方案,也许您应该将其标记为已回答。 Stack overflow 至少是这样工作的。
    • @SwapnilM 我看到您能够解决问题。我面临同样的问题。我在云存储中有一个 txt 格式的模式文件。 [StructField('col1', StructType([ StructField('_data', StringType(), True) ])), StructField('clusterTime', StructType([ StructField('_timestamp' , StructType([ StructField('i',IntegerType(), True)]))]))] 我遇到了与您在final_struct = StructType(fields=data_schema) 这一行提到的相同的问题。你能告诉我你是怎么解决这个问题的吗
    猜你喜欢
    • 2017-04-15
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    相关资源
    最近更新 更多