簡體   English   中英

如何從包含不可讀字符的spark數據幀中過濾掉行

[英]How to filter out rows from spark dataframe containing unreadable characters

我正在讀一個包含設備ID,imei等字段的鑲木地板文件。這個鑲木地板文件是通過讀取由cascading.tuple.Tuple(s)組成的序列文件編寫的。

有些行包含不可讀的字符,我想完全放棄。

這是我如何閱讀文件:

val sparkSession = SparkSession.builder().master(sparkMaster).appName(sparkAppName).config("spark.driver.memory", "32g").getOrCreate()

sparkSession.sparkContext.hadoopConfiguration.set("io.serializations", "cascading.tuple.hadoop.TupleSerialization") 

val df=sparkSession.read.parquet("hdfs://**.46.**.2*2:8020/test/oldData.parquet")

df.printSchema()

val filteredDF=df.select($"$DEVICE_ID", $"$DEVICE_ID_NEW", $"$IMEI”, $”$WIFI_MAC_ADDRESS", $"$BLUETOOTH_MAC_ADDRESS", $"$TIMESTAMP").filter($"$TIMESTAMP" > 1388534400 && $"$TIMESTAMP" < 1483228800)

filteredDF.show(100)

import org.apache.spark.sql.functions.{udf,col,regexp_replace,trim}

val len=udf{ColVal:String => ColVal.size}

val new1DF=filteredDF.select(trim(col("deviceId")))

new1DF.show(100)

val newDF=new1DF.filter((len(col("deviceId")) <20))

newDF.show(100)

即使在長度小於20的設備ID上應用過濾器之后,我仍然會得到那些具有很長設備ID的行,其中包含大部分空格和不可讀字符。

有人可以指出一些可能有助於我過濾這些行的線索。

我還試圖過濾掉那些包含Specials的設備ID。 使用這個:

df.filter($“$ DEVICE_ID”rlike“/ [^ \\ uFFFD] / g”)

我有一個空的數據幀。

架構:

root
 |-- deviceId: string (nullable = true)
 |-- deviceIdNew: string (nullable = true)
 |-- imei: string (nullable = true)
 |-- wifiMacAddress: string (nullable = true)
 |-- bluetoothMacAddress: string (nullable = true)
 |-- timestamp: long (nullable = true)

字符不可靠的行:

+--------------------+
|      trim(deviceId)|
+--------------------+
|                    |
|+~C���...|
|���
    Cv�...|
|���
    Cv�...|
|             �#Inten|
|                �$
                   �|
|                    |
|                    |
|                    |
|                    |
|    0353445a712d877b|
|    0577bc8a29754939|
|    0577bc8a29754939|
|    0577bc8a29754939|
|    0577bc8a29754939|
|    0577bc8a29754939|
|    0577bc8a29754939|
|    0577bc8a29754939|
|    08bdae9e37b48080|

無法比擬的價值觀

    val filteredDF=df.select("deviceId")
                     .filter((len(col("deviceId")) <17))
                     .filter($"$DEVICE_ID" rlike "^([A-Z]|[0-9]|[a-z])+$") 

解決了這個問題。

我之前沒有使用的是正則表達式通配符^匹配開始和$匹配結束。 這確保了只有具有精確匹配的deviceId值的行deviceId通過過濾器。

這個網站真的幫助我生成並測試了所需的正則表達式。

您可以按正則表達式過濾。 例如,您可以使用regex_replace將具有不可讀字符的所有字符(即除字母數字或可打印的任何內容或任何您決定的內容)替換為具有某些值(例如,21個字符常量或甚至空字符串),然后根據此進行過濾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM