Apache spark SPARK 1.2.0 SQLContext需要条件值,如oracle中的case条件
我将spark 1.2.0与python一起使用 我的问题是,在sql查询中,如果字段的值为零,我需要用其他值替换它 我试过case/coalese,它适用于1.4.0,但不适用于1.2.0Apache spark SPARK 1.2.0 SQLContext需要条件值,如oracle中的case条件,apache-spark,apache-spark-sql,pyspark-sql,apache-spark-1.2,Apache Spark,Apache Spark Sql,Pyspark Sql,Apache Spark 1.2,我将spark 1.2.0与python一起使用 我的问题是,在sql查询中,如果字段的值为零,我需要用其他值替换它 我试过case/coalese,它适用于1.4.0,但不适用于1.2.0 case when COALESCE("+fld+",0)=0 then "+str(numavgnumlst[0][lock])+" else "+fld+" end. 然而,对于1.2.0,我尝试对map做同样的操作 sc = SparkContext(appName="RunModelCCATTR"
case when COALESCE("+fld+",0)=0 then "+str(numavgnumlst[0][lock])+" else "+fld+" end.
然而,对于1.2.0,我尝试对map做同样的操作
sc = SparkContext(appName="RunModelCCATTR")
sqlContext=SQLContext(sc)
sqlstr="select ..."
nonzerodf=sqlContext.sql(sqlstr)
.....
iifdatadf=nonzerodf.map(lambda candrow:replacezeroforrow(candrow,numavgnumlst))
....
def replacezeroforrow(rowfields,avgvalfields):
ind=0
lent=len(rowfields)
for rowfield in rowfields[4:lent]:
if rowfield==0:
rowfields[ind]=avgvalfields[ind]
ind=ind+1
return rowfields;
这会引发错误
TypeError: 'Row' object does not support item assignment
不确定我能做些什么来实现spark 1.2.0中的目标
谢谢你的帮助,我想它现在起作用了。。除了列的顺序似乎已经改变之外。。但这可能不是一个问题。
再次感谢
编辑:
这个想法对我帮助很大,需要稍加修改才能解决眼前的问题-
def replacezeroforrow(rowfields,avgvalfields,dont_replace=[]):
rdict = rowfields.asDict()
return Row(dict([(k,avgvalfields[k] if v == 0 and k not in dont_replace else v ) for (k,v) in rdict.items()]))
我修改了原始解决方案以避免“for”的语法错误
方法的调用如下所示-
restrictdict=[FieldSet1,FieldSet2,FieldSet3,FieldSet4,modeldepvarcat[0]]
iifdatadf=nonzerodf.map(lambda candrow: replacezeroforrow(candrow,numavgnumlst[0].asDict(),restrictdict))
但是现在我正试图访问iifdatadf
frstln= iifdatadf.first()
print frstln
我有以下错误
return "<Row(%s)>" % ", ".join(self)
TypeError: sequence item 0: expected string, dict found
返回“%”、“.join(self)
TypeError:序列项0:应为字符串,找到dict
非常感谢您的帮助。您可以使用字典而不是列表,只需返回新行即可:
def replacezeroforrow(row, avgvalfields):
rdict = row.asDict()
return Row(**{k: avgvalfields[k] if v == 0 and k in avgvalfields
else v for (k, v) in rdict.items()})
用法:
>>> r1 = Row(fld1="a", fld2=99, fld3=0, fld4=0)
>>> avgvalfields = {'fld3': 3, 'fld4': 1}
>>> replacezeroforrow(r1, avgvalfields)
Row(fld1='a', fld2=99, fld3=3, fld4=1)
如果您可以发布单独的问题,而不是将您的问题合并为一个问题,这是首选。这样,它可以帮助人们回答你的问题,也可以帮助其他人寻找至少一个你的问题。谢谢