Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
Arrays Spark Scala在数组的数组元素方向上应用函数_Arrays_Scala_Apache Spark_Multidimensional Array - Fatal编程技术网

Arrays Spark Scala在数组的数组元素方向上应用函数

Arrays Spark Scala在数组的数组元素方向上应用函数,arrays,scala,apache-spark,multidimensional-array,Arrays,Scala,Apache Spark,Multidimensional Array,免责声明:我对spark和scala非常陌生。我正在与Spark一起在Scala中进行文档相似性项目。我有一个数据框,看起来像这样: +--------+--------------------+------------------+ | text| shingles| hashed_shingles| +--------+--------------------+------------------+ | qwerty|[qwe, wer, ert, rty]

免责声明:我对spark和scala非常陌生。我正在与Spark一起在Scala中进行文档相似性项目。我有一个数据框,看起来像这样:

+--------+--------------------+------------------+
|    text|            shingles|   hashed_shingles|
+--------+--------------------+------------------+
|  qwerty|[qwe, wer, ert, rty]|  [-4, -6, -1, -9]|
|qwerasfg|[qwe, wer, era, r...|[-4, -6, 6, -2, 2]|
+--------+--------------------+------------------+
在这里,我将文档文本分割成带状,并为每个带状计算一个哈希值

假设我有一个
hash_函数(整数,种子)->integer
。 现在,我想将这种形式的
n
不同的散列函数应用于
hash_shingles
数组。即,获取一个
n
数组的数组,使得每个数组都是
hash_函数(hash_木瓦,seed)
,seed为1到n

我正在尝试类似的东西,但我无法让它工作:

val n=3
df=df.withColumn(“tmp”,array_repeat($“hashed_shingles”,n))//重复minhashes
val minhash_expr=“转换(tmp,(x,i)->散列函数(x,i))”
df=df.withColumn(“tmp”,expr(minhash_expr))//对每个数组应用哈希
我知道如何使用
udf
,但据我所知,它们并没有经过优化,我应该尽量避免使用它们,所以我尝试使用
org.apache.spark.sql.functions

关于如何在没有
udf
的情况下实现它,您有什么想法吗

实现相同目标的
udf
是:

//散列函数族
类哈希器(seed:Int,max_val:Int,p:Int=104729){
private val random_generator=new scala.util.random(种子)
val a=1+2*随机_生成器。nextInt((p-2)/2)//奇数在[1,p-1]
valb=1+random_generator.nextInt(p-2)//[1,p-1]中的b
def getHash(x:Int):Int=((a*x+b)%p)%max\u val
}
//从给定一组ID的哈希器列表中计算一个MinHash列表
类MinHasher(散列:List[Hasher]){
def getMinHash(set:Seq[Int])(hasher:hasher):Int=set.map(hasher.getHash).min
def getMinHashes(set:Seq[Int]):Seq[Int]=hashes.map(getMinHash(set))
}
//明哈舍
val minhash_len=100
val hashes=List.tablate(minhash_len)(n=>newhasher(n,shingle_bin))
val minhasher=新的minhasher(散列)
//计算最小哈希
val minhasherUDF=udf[Seq[Int],Seq[Int]](minhasher.getMinHashes)
df=df.withColumn(“minhashes”,minhasherUDF(“hashed_木瓦))

如果您能提供失败的结果/错误以及预期的结果,这将有助于理解确切的问题/要求。您是对的,我添加了udf,实现了相同的目标。像
transform
(或
aggregate
这样的高阶函数用于转换复杂类型的数据(例如数组)“按元素”使用用户提供的函数。在您的用例中,整个数组由您的自定义函数作为一个整体使用,因此不适合使用
transform
。我同意您的UDF方法。谢谢,很高兴知道。