我在PySpark中有一个.py文件,如下所示:
from pyspark.sql import HiveContext, SQLContext, SparkSession
from pyspark.sql import Row
spark = SparkSession \
.builder \
.appName("Python Spark SQL basic example") \
.config("spark.some.config.option", "some-value") \
.getOrCreate()
sc = spark.sparkContext
sqlContext = SQLContext(sc)
iot = sc.textFile("file:///home/meter/df_final.csv")
iot = iot.map(lambda p: p.split(","))
header = iot.first()
iot_f = iot.filter(lambda p:p != header)
iot_f = iot_f.map(lambda p: Row(DeviceImei = str(p[0]), DeviceTimeStamp =
p[1], Avg_PF=float(p[2]),Sum_PF=float(p[3]),FRQ=int(p[4]),THDVL1=float(p[5]),T ,MachineName = str(p[16]),HUM = int(p[17]),OLI = int(p[18]),GridStatus = bool(p[19]))).toDF()
hc = HiveContext(sc)
iot_f.write.format("orc").saveAsTable("iot")
现在,当我以./bin/spark-submit --master yarn/path/to/file/file.py
的身份提交此工作时,我得到了一个non-keyword arg after keyword arg
的错误
我在哪里想念?我想要一个名为“ iot”的配置单元表。
答案 0 :(得分:0)
在示例代码中,您正在传递参数的数量。
iot_f = iot_f.map(
lambda p: Row(
DeviceImei = str(p[0]),
DeviceTimeStamp = p[1],
Avg_PF=float(p[2]),
Sum_PF=float(p[3]),
FRQ=int(p[4]),
THDVL1=float(p[5]),
T,
MachineName = str(p[7]),
HUM = int(p[8]),
OLI = int(p[9]),
GridStatus = bool(p[10])
)
).toDF()
此处您缺少参数T
(make it T = p[6]
)的值,即您正在获取异常。
在python中,每当传递任意数量的参数时,其强制性要求首先需要传递位置参数,然后传递关键字参数。
在这里,您使用的是Row Class
,因此每个参数都可以是关键字或位置。
如果同时使用两个位置,则必须首先定位。喜欢
iot_f = iot_f.map(
lambda p: Row(
str(p[0]),
p[1],
float(p[2]),
Sum_PF=float(p[3]),
FRQ=int(p[4]),
THDVL1=float(p[5]),
T = p[6],
MachineName = str(p[7]),
HUM = int(p[8]),
OLI = int(p[9]),
GridStatus = bool(p[10])
)
).toDF()