[英]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.