Подстрока на основе 2 строковых идентификаторов в длинной строке - PullRequest
0 голосов
/ 10 июня 2019

У меня есть простое требование, когда у меня есть Dataframe только с одним строковым полем с очень большим строковым значением. Я просто хочу срубить его, чтобы выбрать нужную информацию.

Поле String в моем фрейме данных содержит значение ниже -

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)

Все, что я хочу получить от этого значения, - это базовое расположение разделов, которое ... hdfs: // share / dev / stage / partition_chk

Обратите внимание, я просто хочу эту строку в кавычках (без префикса "location:"). Любые идеи, какие операции подстановки в pyspark могут помочь.

Спасибо!

Sid

1 Ответ

1 голос
/ 11 июня 2019

Есть несколько способов сделать это, но регулярное выражение, по моему мнению, является самым прямым. В 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
...