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 Pyspark使用udf处理数组列并返回另一个数组_Apache Spark_Pyspark - Fatal编程技术网

Apache spark Pyspark使用udf处理数组列并返回另一个数组

Apache spark Pyspark使用udf处理数组列并返回另一个数组,apache-spark,pyspark,Apache Spark,Pyspark,使用udf处理数组列并返回另一个数组 以下是我的意见: docID瓦 D1[23,25,39,59] D2[34,45,65] 我想通过处理shingles数组列来生成一个名为Hash的新列: 例如,我想提取最小值和最大值(这只是一个示例,说明我想要一个固定长度的数组列,实际上我不想找到最小值或最大值) docID木瓦散列 D1[23,25,39,59][23,59] D2[34,45,65][34,65] 我创建了一个udf,如下所示: def generate_minhash_signatu

使用udf处理数组列并返回另一个数组

以下是我的意见:

docID瓦 D1[23,25,39,59] D2[34,45,65]

我想通过处理shingles数组列来生成一个名为Hash的新列: 例如,我想提取最小值和最大值(这只是一个示例,说明我想要一个固定长度的数组列,实际上我不想找到最小值或最大值)

docID木瓦散列 D1[23,25,39,59][23,59] D2[34,45,65][34,65]

我创建了一个udf,如下所示:

def generate_minhash_signatures(shingles, coeffA, coeffB):
    signature = []
    minHashCode = nextPrime + 1
    maxHashCode = 0
    for shingleID in shingles:
        if shingleID < minHashCode:
            minHashCode = shingleID
        if shingleID > maxHashCode:
            maxHashCode = shingleID
    return [minHashCode, maxHashCode]

minhash_udf = udf(generate_minhash_signatures, ArrayType(IntegerType()))
df_with_minhash = df.withColumn('min_max_hash', minhash_udf("shingles", coeffA, coeffB))
df_with_minhash.show()
def生成_minhash_签名(木瓦、coeffA、coeffB):
签名=[]
minHashCode=nextTime+1
maxHashCode=0
对于木瓦中的木瓦:
如果shingleIDmaxHashCode:
maxHashCode=shingleID
返回[minHashCode,maxHashCode]
minhash\u udf=udf(生成\u minhash\u签名,ArrayType(IntegerType()))
df_with_minhash=df.withColumn('min_max_hash',minhash_udf(“木瓦”,coeffA,coeffB))
df_with_minhash.show()
但它给出了以下错误:

TypeError: Invalid argument, not a string or column: [2856022824, 2966132496, 947839218, 1658426276, 1862779421, 3729685802, 1710806966, 2696513050, 3630333076, 2555745391] of type <class 'list'>. For column literals, use 'lit', 'array', 'struct' or 'create_map' function.
TypeError:无效参数,不是类型为[28560228242966132496994783921816584262761862779421 3729685802 17108069626965130503330762555745391]的字符串或列。对于列文字,请使用“lit”、“array”、“struct”或“create_map”函数。
实际自定义项:

def generate_minhash_signatures(shingles, coeffA, coeffB, numHashes):
    signature = []
    for i in range(0, numHashes):
        minHashCode = nextPrime + 1
        for shingleID in shingles:
            hashCode = (coeffA[i] * shingleID + coeffB[i]) % nextPrime

            if hashCode < minHashCode:
                minHashCode = hashCode

        signature.append(minHashCode)
    return signature
def生成minhash签名(木瓦、coeffA、coeffB、numhash):
签名=[]
对于范围内的i(0,numhash):
minHashCode=nextTime+1
对于木瓦中的木瓦:
hashCode=(coeffA[i]*shingleID+coeffB[i])%nexttime
如果hashCode
您的
udf
希望所有三个参数都是列。很可能
coeffA
coeffB
不仅仅是数值,您需要使用
lit
将其转换为列对象:

导入pyspark.sql.f函数
df.with column('min_max_hash',minhash_udf(f.col(“木瓦”),f.lit(coeffA),f.lit(coeffB)))
如果
coeffA
coeffB
是列表,请使用
f.array
创建文本,如下所示:

df.withColumn('min\u max\u hash',
minhash_udf(f.col(“瓦”),
f、 数组(*映射(f.lit,coeffA)),
f、 数组(*映射(f.lit,coeffB))
)
或将列参数和非列参数分开,如下所示:

def生成minhash签名(coeffA、coeffB、numhash)
def生成\u minhash\u签名\u内部(木瓦):
签名=[]
对于范围内的i(0,numhash):
minHashCode=nextTime+1
对于木瓦中的木瓦:
hashCode=(coeffA[i]*shingleID+coeffB[i])%nexttime
如果hashCode
然后您可以按以下方式调用该函数:

df.withColumn('min_max_hash',生成_minhash_签名(coeffA、coeffB、numhash)(“木瓦”))

您的
udf
希望所有三个参数都是列。很可能
coeffA
coeffB
不仅仅是数值,您需要使用
lit
将其转换为列对象:

导入pyspark.sql.f函数
df.with column('min_max_hash',minhash_udf(f.col(“木瓦”),f.lit(coeffA),f.lit(coeffB)))
如果
coeffA
coeffB
是列表,请使用
f.array
创建文本,如下所示:

df.withColumn('min\u max\u hash',
minhash_udf(f.col(“瓦”),
f、 数组(*映射(f.lit,coeffA)),
f、 数组(*映射(f.lit,coeffB))
)
或将列参数和非列参数分开,如下所示:

def生成minhash签名(coeffA、coeffB、numhash)
def生成\u minhash\u签名\u内部(木瓦):
签名=[]
对于范围内的i(0,numhash):
minHashCode=nextTime+1
对于木瓦中的木瓦:
hashCode=(coeffA[i]*shingleID+coeffB[i])%nexttime
如果hashCode
然后您可以按以下方式调用该函数:

df.withColumn('min_max_hash',生成_minhash_签名(coeffA、coeffB、numhash)(“木瓦”))

what is
shingle\u udf
?更新了它,它应该使用minhash\u udf的可能副本,什么是
shingle\u udf
?更新了它,它应该使用minhash\u udf的可能副本,coeffA和coeffB是固定长度的列表。我更新了这个问题,以包括实际的udf。coeffA和coeffB是固定长度的列表h、 我更新了这个问题,以包括实际的自定义项。