2017-10-16 11 views
1

AWS S3にCSVファイルがあり、AWS Glueにロードされています。つまり、S3のソースデータファイルに変換を適用します。 PySparkスクリプト環境を提供します。データは多少のようになります。カラムの数値にSQLクエリーでアルファベットが含まれているかどうかを確認する方法

結果はこのようにする必要があり期待
"ID","CNTRY_CD","SUB_ID","PRIME_KEY","DATE"  
"123","IND","25635525","11243749772","2017-10-17"  
"123","IND","25632349","112322abcd","2017-10-17"  
"123","IND","25635234","11243kjsd434","2017-10-17"  
"123","IND","25639822","1124374343","2017-10-17" 

:ここで私はその結果アルファベットが含まれていてもよい整数型の名「PRIME_KEY」でフィールドに取り組んでいます

"123","IND","25632349","112322abcd","2017-10-17"  
"123","IND","25635234","11243kjsd434","2017-10-17" 

不正なデータ形式です。

ここで、Integer型の主キー列にSQLクエリを使用する数値だけでなく、英数字が含まれているかどうかを調べる必要があります。これまでのところ、私は、以下のいずれかのようにこれを行うには、正規表現のいくつかのバリエーションを試してみましたが、ない運:

SELECT * 
FROM table_name 
WHERE column_name IS NOT NULL AND 
CAST(column_name AS VARCHAR(100)) LIKE \'%[0-9a-z0-9]%\' 

ソーススクリプト:

args = getResolvedOptions(sys.argv, ['JOB_NAME']) 
glueContext = GlueContext(SparkContext.getOrCreate()) 
spark = glueContext.spark_session 
job = Job(glueContext) 
job.init(args['JOB_NAME'], args) 
# s3 output directory 
output_dir = "s3://aws-glue-scripts../.." 

# Data Catalog: database and table name 
db_name = "sampledb" 
glue_tbl_name = "sampleTable" 

datasource = glueContext.create_dynamic_frame.from_catalog(database = db_name, table_name = glue_tbl_name) 
datasource_df = datasource.toDF() 
datasource_df.registerTempTable("sample_tbl") 
invalid_primarykey_values_df = spark.sql("SELECT * FROM sample_tbl WHERE CAST(PRIME_KEY AS STRING) RLIKE '([a-z]+[0-9]+)|([0-9]+[a-z]+)'") 
invalid_primarykey_values_df.show() 

は、このスクリプトの出力は下に与えられていません

+ --- + -------- + -------- + ------------ + ---------- + ----------- + --------------- +

| ID | CNTRY_CD | SUB_ID | PRIME_KEY | DATE |

+ --- + -------- + -------- + ------------ + ---------- + ----------- + --------------- +

| 123 | IND | 25635525 | [11243749772、null] | 2017-10-17 | 12030343 | [null、112322ab .. | 2017-10-17 |

| 123 | IND | 25635234 | [null、11243kjsd .. | 2017-10-17 |

| 123 | IND | 25639822 | [1124374343、null] | 2017-10-17 |

+ -------- + -------- + -------------------- + ------ ---- + ----------- + --------------- +

私が取り組んでいるフィールドの値を強調しました。ソースデータとは多少異なって見えます。

これに関するお手伝いがあれば幸いです。おかげ

答えて

1

あなたはRLIKE

SELECT * 
FROM table_name 
WHERE CAST(PRIME_KEY AS STRING) RLIKE '([0-9]+[a-z]+)' 

より一般的な英数字フィルタマッチングを使用することができます。

WHERE CAST(PRIME_KEY AS STRING) RLIKE '([a-z]+[0-9]+)|([0-9]+[a-z]+)' 

編集:コメントどおり

必要な輸入品とUDF

val spark = SparkSession.builder 
    .config(conf) 
    .getOrCreate 

import org.apache.spark.sql.functions._ 
val extract_pkey = udf((x: String) => x.replaceAll("null|\\]|\\[|,", "").trim) 

import spark.implicits._ 

試験用のサンプルデータを設定し、UDF

val df = Seq(
    ("123", "IND", "25635525", "[11243749772,null]", "2017-10-17"), 
    ("123", "IND", "25632349", "[null,112322abcd]", "2017-10-17"), 
    ("123", "IND", "25635234", "[null,11243kjsd434]", "2017-10-17"), 
    ("123", "IND", "25639822", "[1124374343,null]", "2017-10-17") 
).toDF("ID", "CNTRY_CD", "SUB_ID", "PRIME_KEY", "DATE") 
    .withColumn("PRIME_KEY", extract_pkey($"PRIME_KEY")) 


df.registerTempTable("tbl") 

spark.sql("SELECT * FROM tbl WHERE PRIME_KEY RLIKE '([a-z]+[0-9]+)|([0-9]+[a-z]+)'") 
    .show(false) 

+---+--------+--------+------------+----------+ 
|ID |CNTRY_CD|SUB_ID |PRIME_KEY |DATE  | 
+---+--------+--------+------------+----------+ 
|123|IND  |25632349|112322abcd |2017-10-17| 
|123|IND  |25635234|11243kjsd434|2017-10-17| 
+---+--------+--------+------------+----------+ 
を清掃
関連する問題