我正在讀取包含某些字段(如設備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的行和不可讀的字符。
有人可以指出一些可能會幫助我過濾這些行的線索。
我也嘗試過濾出包含特價商品的設備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|