[英]Different output between DISTINCT SQL statement and DISTINCT method from pyspark
我正在一個 +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())
output 為 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;
output 為 2,312,252
兩種情況下讀取的行數相同:11,474,580。 這意味着在這兩種情況下,數據集都是相同的。 數據讀取沒有問題。
似乎 SQLite 將 pyspark 沒有的某些字符串標識為不同的值。 有人在任何時候遇到過這個問題嗎? 我該如何解決這個問題?
在 sql 查詢中,您在一列(prove_dest)上執行不同的操作,但在 pyspark 中,您在 rdd 的所有列上執行不同的操作。 這就是為什么你有不同的結果
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.