Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark SPARK 1.2.0 SQLContext需要条件值,如oracle中的case条件_Apache Spark_Apache Spark Sql_Pyspark Sql_Apache Spark 1.2 - Fatal编程技术网

Apache spark SPARK 1.2.0 SQLContext需要条件值,如oracle中的case条件

Apache 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"

我将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")
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)

如果您可以发布单独的问题,而不是将您的问题合并为一个问题,这是首选。这样,它可以帮助人们回答你的问题,也可以帮助其他人寻找至少一个你的问题。谢谢