Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.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
Python Spark数据帧更新列,其中其他列与PySpark类似_Python_Apache Spark_Pyspark_Apache Spark Sql - Fatal编程技术网

Python Spark数据帧更新列,其中其他列与PySpark类似

Python Spark数据帧更新列,其中其他列与PySpark类似,python,apache-spark,pyspark,apache-spark-sql,Python,Apache Spark,Pyspark,Apache Spark Sql,这将创建我的示例数据帧: df = sc.parallelize([('abc',),('def',)]).toDF() #( df = df.selectExpr("_1 as one",) df = df.withColumn("two", lit('z')) df.show() 看起来像这样: for letter in ['a','b','c','d']: df = df['two'].where(col('one').like("%{}%".format(letter)))

这将创建我的示例数据帧:

df = sc.parallelize([('abc',),('def',)]).toDF() #(
df = df.selectExpr("_1 as one",)
df = df.withColumn("two", lit('z'))
df.show()
看起来像这样:

for letter in ['a','b','c','d']:
    df = df['two'].where(col('one').like("%{}%".format(letter))) += letter
+---+---+
|一二|
+---+---+
|abc|z|
|def|z|
+---+---+
现在我要做的是一系列的
SQL语句,其中like
语句追加列
two
,无论它是否匹配

在“伪代码”中,它如下所示:

for letter in ['a','b','c','d']:
    df = df['two'].where(col('one').like("%{}%".format(letter))) += letter
最终生成如下所示的df:

for letter in ['a','b','c','d']:
    df = df['two'].where(col('one').like("%{}%".format(letter))) += letter
+---+----+
|一二|
+---+----+
|abc | zabc|
|def | zd|
+---+----+

如果要使用字符串列表来子集字符串列,最好使用
广播
变量。让我们从一个更现实的示例开始,其中字符串仍然包含空格:

df = sc.parallelize([('a b c',),('d e f',)]).toDF()
df = df.selectExpr("_1 as one",)
df = df.withColumn("two", lit('z'))
然后,我们从字母列表中创建一个
broadcast
变量,然后定义一个
udf
,使用它们来子集字符串列表;最后将它们与另一列中的值连接,返回一个字符串:

letters = ['a','b','c','d']
letters_bd = sc.broadcast(letters) 

def subs(col1, col2):

    l_subset =  [x for x in col1 if x in letters_bd.value]
    return col2 + ' ' + ' '.join(l_subset)

subs_udf = udf(subs)
要应用上述内容,我们正在子集的字符串需要转换为列表,因此我们首先使用函数
split()
,然后应用我们的
udf

from pyspark.sql.functions import col, split

df.withColumn("three", split(col('one'), r'\W+')) \
  .withColumn("three", subs_udf("three", "two")) \
  .show()
+-----+---+-------+
|  one|two|  three|
+-----+---+-------+
|a b c|  z|z a b c|
|d e f|  z|    z d|
+-----+---+-------+
或者不使用
udf
,使用
regexp\u replace
concat
,如果您的字母可以轻松地放入
regex
表达式中

from pyspark.sql.functions import regexp_replace, col, concat, lit

df.withColumn("three", concat(col('two'), lit(' '), 
              regexp_replace(col('one'), '[^abcd]', ' ')))

expr
带有
regexp\u replace
可能是性能方面更好的选择。在2.1+中,您可以使用“是”有效答案,但遗憾的是,对于我正在开发的应用程序来说,这是不切实际的。对不起,我没有指定这个。我得到了1000多万个文档(在
one
中)和一个嵌套的
字典
,其中包含500多万个关键字,我想将它们与之匹配,并在
two
中计算结果。Regex是我的第一个方法,但是
like
in
要快得多,所以我试图找到一个包含它们的解决方案。那么
one
列包含了一些句子,您在其中筛选特定的单词?你把
two
中的词(?)附加到结果中?是的。基本上,我有一个在
one
中寻找的单词的初始列表,如果这个单词出现在
one
中,我会将它附加到
two
中。我的想法是我有一个这样的嵌套字典:
dict[word][word][word]=some\u id
。现在,我希望顶级词典中与
one
匹配的所有键都存储在
two
中,以便以后对词典的更深层次重复这些过程,最后到达
some\u id
。这看起来非常有帮助,非常感谢!我稍后再试试