Есть несколько способов сделать это, но регулярное выражение, по моему мнению, является самым прямым. В pyspark вам нужна функция regexp_extract , чтобы применить регулярное выражение и извлечь группы совпадений. Регулярное выражение - следующая важная вещь для вас. Следующее регулярное выражение:
location:([a-zA-Z:\/\/_]*)
соответствует всем символам из следующих:
- строчные буквы
- заглавные буквы
-
- /
- _
после встречи location:
. Конечно, вы также можете использовать что-то вроде location:([^,]*)
, которое соответствует всему после location:
до первой запятой, но это действительно зависит от возможных совпадений. Ниже приведен пример:
from pyspark.sql import functions as F
l = [
( "Table(tableName:partition_chk, dbName:stage, owner:hive, createTime:1559243466, lastAccessTime:0, retention:0, sd:StorageDescriptor(cols:[FieldSchema(name:id, type:string, comment:null), FieldSchema(name:name, type:string, comment:null), FieldSchema(name:dw_date, type:string, comment:null)], location:hdfs://share/dev/stage/partition_chk, inputFormat:org.apache.hadoop.mapred.TextInputFormat, outputFormat:org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat, compressed:false, numBuckets:-1, serdeInfo:SerDeInfo(name:null, serializationLib:org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, parameters:{line.delim=, field.delim=,, serialization.format=,}), bucketCols:[], sortCols:[], parameters:{}, skewedInfo:SkewedInfo(skewedColNames:[], skewedColValues:[], skewedColValueLocationMaps:{}), storedAsSubDirectories:false), partitionKeys:[FieldSchema(name:dw_date, type:string, comment:null)], parameters:{EXTERNAL=TRUE, transient_lastDdlTime=1559243466}, viewOriginalText:null, viewExpandedText:null, tableType:EXTERNAL_TABLE)" , )
]
columns = ['hugeString']
df = spark.createDataFrame(l, columns)
#collect() turns the dataframe into a python list of Rows
#I don't know if you need this or not
#In case you want to extract it into a new column, use withColumn instead of select
df.select(F.regexp_extract('hugeString', "location:([a-zA-Z:\/_]*)", 1).alias('match')).collect()[0]['match']
Выход:
hdfs://share/dev/stage/partition_chk