python - AttributeError:“str”对象没有属性“name”PySpark
问题描述
我创建了列表并尝试将其分配给 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'
请帮助我了解这里出了什么问题。
解决方案
我看到的问题是:
- 您正在将 a 传递给
str
调用StructType()
,而不是一个列表,[StructField(),]
或者因为您nargs='+'
可能正在传递一个字符串列表。即["StructField('col1', StringType(), True)", "StructField('col2', StringType(), True)", "StructField('col3', StringType(), True)", "StructField('col4', StringType(), True)"]
。 - 如果您真的想将字段作为 cmd arg 接收,那么您应该考虑验证此 arg 并将其转换为所需的 python 类型。您可以查看
json
、pickle
或。eval
exec
除此之外,其他一切都应该工作。
self.names = [f.name for f in fields]
中断是因为fields
它是一个str
而不是一个列表StructField
,如果它是一个StructField
预期的列表,那么f.name
调用应该可以正常工作:-)
我希望这有帮助。
推荐阅读
- c# - ZXing.Net.Mobile 应用崩溃
- java - 有没有办法将 mutator 方法作为参数传递给另一个方法?
- c# - c#同时向同一页面发送多个请求(例如:登录)
- azure - 无法使用 Azure Active Diectory Bearer 令牌对 Azure Functions 进行身份验证
- wordpress - Wordpress ModRewrite 不起作用?
- sdk - Websphere 8.5.5.13 中的 SDK 版本和安装
- python - Pyqtgraph & 根据表面图的高度更改颜色
- windows-10 - ClickOnce 应用程序无法启动
- python - 将行附加到熊猫中的组
- php - 在 Laravel 5.5 中无法使用 SSH 密钥连接到远程服务器?