问题描述
我正在一个 +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_impor
、prove_dest
、sim_sptos
、porg
。第二个 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 的所有列执行不同操作。这就是为什么你有不同的结果