Arrays Spark Scala在数组的数组元素方向上应用函数
免责声明:我对spark和scala非常陌生。我正在与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]
+--------+--------------------+------------------+
| 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方法。谢谢,很高兴知道。