在pyspark中调用foreach for dataframe时出现__getattr__错误

时间:2016-04-21 04:19:15

标签: dataframe pyspark spark-dataframe getattr

我正在尝试解析SQL查询,并希望为数据帧的每一行调用一个函数。功能如下:

def updateParser(df):
# update tab1 set value1 = 0.34 where id = 1111
# identify positions
setPos = df.select(instr(df.query, ' set ').alias('set')).collect()[0].set
wherePos = df.select(instr(df.query, ' where ').alias('where')).collect()[0].where
idPos = df.select(instr(df.query, ' id').alias('id')).collect()[0].id

# identify table, fields&values, id
df = df.withColumn('table', upper(trim(df.query.substr(7, setPos - 7))))
df = df.withColumn('fieldValueList', upper(trim(df.query.substr(setPos + 5, (wherePos - (setPos + 5) + 1)))))
df = df.withColumn('id', upper(trim(df.query.substr(idPos + 5, 10))))
#identify the column being updated and the value
df.show(n=5, truncate = False)

我通过以下方式致电:

updateDF.foreach(updateParser)

但我收到以下错误:

  File "/home/mapr/scripts/cdc.py", line 19, in updateParser
setPos = df.select(instr(df.query, ' set ').alias('set')).collect()[0].set
  File "/opt/mapr/spark/spark-1.5.2/python/lib/pyspark.zip/pyspark/sql/types.py", line 1257, in __getattr__
raise AttributeError(item)
AttributeError: select

我没有在任何地方使用 getattr ..是否需要?如果我不使用foreach并直接在数据帧上运行它,那么它运行正常。任何人都可以提出建议。

1 个答案:

答案 0 :(得分:0)

我发现了问题 - 因为我为每一行调用了一个数据帧,所以我不能在每一行使用df.select。相反,我需要使用Row对象及其方法。这就是属性错误中的原因,select是一个错误,因为它不是一个有效的操作。