相关疑难解决方法(0)

高效的字符串后缀检测

我正在使用PySpark处理一个庞大的数据集,我希望根据另一个数据框中的字符串过滤数据帧.例如,

dd = spark.createDataFrame(["something.google.com","something.google.com.somethingelse.ac.uk","something.good.com.cy", "something.good.com.cy.mal.org"], StringType()).toDF('domains')
+----------------------------------------+
|domains                                 |
+----------------------------------------+
|something.google.com                    |
|something.google.com.somethingelse.ac.uk|
|something.good.com.cy                   |
|something.good.com.cy.mal.org           |
+----------------------------------------+  

dd1 =  spark.createDataFrame(["google.com", "good.com.cy"], StringType()).toDF('gooddomains')
+-----------+
|gooddomains|
+-----------+
|google.com |
|good.com.cy|
+-----------+
Run Code Online (Sandbox Code Playgroud)

我认为domainsgooddomains有效的域名.

我想要做的是过滤掉dd不结束的匹配字符串dd1.所以在上面的例子中,我想过滤掉第1行和第3行,最后得到

+----------------------------------------+
|domains                                 |
+----------------------------------------+
|something.google.com.somethingelse.ac.uk|
|something.good.com.cy.mal.org           |
+----------------------------------------+  
Run Code Online (Sandbox Code Playgroud)

我目前的解决方案(如下所示)只能考虑最多3个字的域名.如果我要添加say,verygood.co.ac.ukin dd1(即白名单),那么它将失败.

def split_filter(x, whitelist):
    splitted1 = x.select(F.split(x['domains'], '\.').alias('splitted_domains'))
    last_two = splitted1.select(F.concat(splitted1.splitted_domains[F.size(splitted1.splitted_domains)-2], \
       F.lit('.'), \
       splitted1.splitted_domains[F.size(splitted1.splitted_domains)-1]).alias('last_two'))
    last_three = splitted1.select(F.concat(splitted1.splitted_domains[F.size(splitted1.splitted_domains)-3], \
       F.lit('.'), \
       splitted1.splitted_domains[F.size(splitted1.splitted_domains)-2], \
       F.lit('.'), \
       splitted1.splitted_domains[F.size(splitted1.splitted_domains)-1]).alias('last_three'))
    x = …
Run Code Online (Sandbox Code Playgroud)

python string-matching apache-spark apache-spark-sql pyspark

7
推荐指数
1
解决办法
733
查看次数

Pyspark:计算向量列的余弦相似度的最快方法是什么

Pyspark 初学者问题在这里!我有一个大约 2M 行已矢量化文本的数据框(通过 w2v;300 维)。计算每行相对于新的单向量输入的余弦距离的最有效方法是什么?

我当前的方法使用 udf 并需要几分钟,对于我想要创建的 web 应用程序来说太长了。

创建样本 df:

import numpy as np
import pandas as pd
from pyspark.sql.functions import *

column=[]
num_rows = 10000 #change to 2000000 to really slow your computer down!
for x in range(num_rows):
    sample = np.random.uniform(low=-1, high=1, size=(300,)).tolist()
    column.append(sample)
index = range(1000)
df_pd = pd.DataFrame([index, column]).T
#df_pd = pd.concat([df.T[x] for x in df.T], ignore_index=True)
df_pd.head()
df = spark.createDataFrame(df_pd).withColumnRenamed('0', 'Index').withColumnRenamed('1', 'Vectors')
df.show()
Run Code Online (Sandbox Code Playgroud)

创建一个示例输入(我将其创建为 Spark df,以便通过现有管道进行转换):

new_input = np.random.uniform(low=-1, high=1, size=(300,)).tolist()
df_pd_new …
Run Code Online (Sandbox Code Playgroud)

python dataframe apache-spark apache-spark-sql pyspark

6
推荐指数
1
解决办法
5920
查看次数

优化Spark作业,必须为每个条目相似度计算每个条目,并为每个条目输出前N个相似项目

我有一个需要计算基于电影内容的相似性的Spark工作.有46k电影.每部电影由一组SparseVectors表示(每个矢量是电影场之一的特征向量,例如Title,Plot,Genres,Actors等).例如,对于Actors和Genres,向量显示给定的actor是否在电影中存在(1)或不存在(0).

任务是为每部电影找到前10个类似的电影.我设法在Scala中编写一个脚本来执行所有这些计算并完成工作.它适用于较小的电影集,如1000部电影,但不适用于整个数据集(内存不足等).

我进行此计算的方法是在电影数据集上使用交叉连接.然后通过仅获取movie1_id <movie2_id的行来减少问题.此时数据集仍然包含46000 ^ 2/2行,即1058000000.每行都有大量数据.

然后我计算每一行的相似度得分.在计算相似度之后,我将movie1_id相同的结果分组,并按照相似性得分的降序对它们进行排序,使用前N个项目的Window函数(类似于此处描述的方式:Spark获得每个项目的前N个最高得分结果(item1,item2) ,得分)).

问题是 - 它可以在Spark中更有效地完成吗?例如,无需执行crossJoin?

还有一个问题--Spark如何处理如此庞大的数据帧(1058000000行由多个SparseVectors组成)?是否必须一次将所有这些保留在内存中?或者它是否以某种方式逐个处理这样的数据帧?


我正在使用以下函数来计算电影矢量之间的相似性:

def intersectionCosine(movie1Vec: SparseVector, movie2Vec: SparseVector): Double = {
val a: BSV[Double] = toBreeze(movie1Vec)
val b: BSV[Double] = toBreeze(movie2Vec)

var dot: Double = 0
var offset: Int = 0
while( offset < a.activeSize) {
  val index: Int = a.indexAt(offset)
  val value: Double = a.valueAt(offset)

  dot += value * b(index)
  offset += 1
}

val bReduced: BSV[Double] = new BSV(a.index, a.index.map(i => b(i)), a.index.length)
val maga: Double …
Run Code Online (Sandbox Code Playgroud)

scala cross-join apache-spark

6
推荐指数
1
解决办法
1735
查看次数

我们如何使用SQL-esque"LIKE"标准加入两个Spark SQL数据帧?

我们使用PySpark库与Spark 1.3.1连接.

我们有两个数据帧,documents_df := {document_id, document_text}keywords_df := {keyword}.我们想要{document_id, keyword}使用keyword_df.ocuword出现在document_df.document_text字符串中的条件来加入两个数据帧并返回带有对的结果数据帧.

例如,在PostgreSQL中,我们可以使用表单的ON子句来实现:

document_df.document_text ilike '%' || keyword_df.keyword || '%'

但是在PySpark中,我无法使用任何形式的连接语法.以前有人有过这样的经历吗?

亲切的问候,

python apache-spark apache-spark-sql pyspark

5
推荐指数
1
解决办法
5098
查看次数

Apache Spark 文本相似度

我正在尝试以下 Java 示例

Apache Spark 中的高效字符串匹配

这是我的代码

public class App {
    public static void main(String[] args) {
        System.out.println("Hello World!");

        System.setProperty("hadoop.home.dir", "D:\\del");

        List<MyRecord> firstRow = new ArrayList<MyRecord>();
        firstRow.add(new App().new MyRecord("1", "Love is blind"));

        List<MyRecord> secondRow = new ArrayList<MyRecord>();
        secondRow.add(new App().new MyRecord("1", "Luv is blind"));

        SparkSession spark = SparkSession.builder().appName("LSHExample").config("spark.master", "local")
                .getOrCreate();

        Dataset firstDataFrame = spark.createDataFrame(firstRow, MyRecord.class);
        Dataset secondDataFrame = spark.createDataFrame(secondRow, MyRecord.class);

        firstDataFrame.show(20, false);
        secondDataFrame.show(20, false);

        RegexTokenizer regexTokenizer = new RegexTokenizer().setInputCol("text").setOutputCol("words")
                .setPattern("\\W");
        NGram ngramTransformer = new NGram().setN(3).setInputCol("words").setOutputCol("ngrams");
        HashingTF hashingTF = new HashingTF().setInputCol("ngrams").setOutputCol("vectors");
        MinHashLSH …
Run Code Online (Sandbox Code Playgroud)

apache-spark apache-spark-ml apache-spark-mllib

4
推荐指数
1
解决办法
1922
查看次数

Pyspark levenshtein连接错误

我想基于Levenshtein距离执行连接。

我有2张桌子:

  1. Data:这是HDFS文件存储库中的CSV。列之一是Disease description,15K行。
  2. df7_ct_map:我从Hive呼叫的表格。列之一是Disease Indication,20K行。

我试图通过将每个描述与适应症(它们是疾病的文字描述)相匹配来连接两个表。理想情况下,它们必须相同,但是如果两个文本都不相同,我希望选择包含最大数量的常用单词的匹配文本。

from pyspark.sql.functions import levenshtein  
joinedDF = df7_ct_map.join( Data, levenshtein(df7_ct_map("description"), 
Data("Indication")) < 3)
joinedDF.show(10)
Run Code Online (Sandbox Code Playgroud)

问题DataDataFrame这就是为什么我得到以下错误:

TypeError: 'DataFrame' object is not callable
TypeError                                 Traceback (most recent call last)
in engine
----> 1 joinedDF = df7_ct_map.join( Data, levenshtein(df7_ct_map("description"), Data("Indication")) < 3)

TypeError: 'DataFrame' object is not callable
Run Code Online (Sandbox Code Playgroud)

一些忠告?我可以使用Fuzzywuzzy软件包吗?如果是这样,怎么办?

python levenshtein-distance apache-spark-sql fuzzywuzzy pyspark

1
推荐指数
1
解决办法
2196
查看次数

如何基于通配符/正则表达式条件在Spark中加入2个数据框?

我有2个数据框df1df2。假设有一location列中df1可能包含常规URL或带有通配符的URL,例如:

  • stackoverflow.com/questions/*
  • * .cnn.com
  • cnn.com/*/politics

该数据帧秒df2url场可能仅含有不带通配符有效的URL。

我需要连接这两个数据框,就像在连接条件中df1.join(df2, $"location" matches $"url")有魔术matches运算符一样。

经过一番谷歌搜索后,我仍然没有找到一种方法来实现这一目标。您将如何解决此类问题?

scala apache-spark

0
推荐指数
1
解决办法
2334
查看次数