来自pyspark的DISTINCT SQL语句和DISTINCT方法之间的不同输出

问题描述

我正在一个 +11M 行的数据集中进行一些清理,该数据集中包含噪音很大的企业名称。我想进行一些正则表达式清理(删除标点符号、空格、数字、重音和一些其他问题),然后应用一些近似字符串匹配算法,如 TF-IDF 或 BM25,但这是另一个问题。 >

编辑

这是我的前五行(包括标题)。

FILE_PATH = "my_folder/dataset.csv/"
spark = SparkSession.builder.getorCreate()
sc = spark.sparkContext
my_rdd = spark.sparkContext.textFile(FILE_PATH)
my_rdd.take(5)

['cuit_impor,prove_dest,sim_sptos,porg','34557619099,PUMA SPORTS LA SA,61099000111N,337',61102000110R,306',310',61103000912D,337']

它以字符串列表的形式呈现。但是使用以下代码,我将每个字符串拆分为一个包含四个元素的列表。

my_rdd_splitted = my_rdd.map(lambda x: x.split(',')).cache()
my_rdd_splitted.take(5)

[['cuit_impor','prove_dest','sim_sptos','porg'],['34557619099','PUMA SPORTS LA SA                                 ','61099000111N','337'],'61102000110R','306'],'310'],'61103000912D','337']]

如您所见,我的列是 cuit_imporprove_destsim_sptosporg。第二个 prove_dest 是具有名称的那个。为了达到清理数据集的目标,我首先获得了所有不同的“脏”名称,因此我使用 pyspark 读取数据集并运行:

#in the map method I split the string and select the element in position 1,and 
#then apply distinct. 
unique_names = my_rdd.map(lambda x: x.split(",")[1]).disinct().cache()
print(unique_names.count())

输出为 2,292,034。

为了检查一切是否正常,我再次寻找不同的值,使用 sqlite 的 DB 浏览器,版本 3.11.2,带有这句话:

CREATE TABLE "dataset" (
    "cuit_impor"    REAL,"prove_dest"    TEXT,"sim_sptos" TEXT,"porg"  INTEGER
);

SELECT COUNT(disTINCT prove_dest)
FROM dataset;

输出为 2,312,252

两种情况下读取的行数相同:11,474,580。这意味着在这两种情况下,数据集是相同的。数据读取没有问题。

似乎 sqlite 将某些 pyspark 没有的字符串标识为不同的值。有没有人在任何时候遇到过这个问题?我该如何解决这个问题?

解决方法

在 sql 查询中,您对一列执行不同操作 (prove_dest) 但在 pyspark 中,您对 rdd 的所有列执行不同操作。这就是为什么你有不同的结果

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...