0

我正在一个 +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 没有的某些字符串识别为不同的值。有人在任何时候遇到过这个问题吗?我该如何解决这个问题?

4

1 回答 1

1

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

于 2021-05-31T14:31:45.350 回答