我正在一个 +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',
'34557619099,PUMA SPORTS LA SA ,61102000110R,306',
'34557619099,PUMA SPORTS LA SA ,61102000110R,310',
'34557619099,PUMA SPORTS LA SA ,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'],
['34557619099',
'PUMA SPORTS LA SA ',
'61102000110R',
'306'],
['34557619099',
'PUMA SPORTS LA SA ',
'61102000110R',
'310'],
['34557619099',
'PUMA SPORTS LA SA ',
'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。
为了检查一切是否正常,我再次使用 DB Browser for SQLite,版本 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 没有的某些字符串识别为不同的值。有人在任何时候遇到过这个问题吗?我该如何解决这个问题?