Python Spark:在关键字arg之后添加非关键字arg

时间:2019-03-11 10:31:29

标签: hive pyspark

我在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”的配置单元表。

1 个答案:

答案 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()

此处您缺少参数Tmake 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()