Разделить значение столбца DataFrame на "|" и получите все предметы кроме первого - PullRequest
1 голос
/ 14 июля 2020

Мне нужно разделить значение столбца на '|' , получить все элементы, кроме первого, для нового столбца «адрес». Еще больше усложняет то, что количество элементов не всегда одинаково!

df1 = spark.createDataFrame([
  ["Luc  Krier|2363  Ryan Road"],
  ["Jeanny  Thorn|2263 Patton Lane|Raleigh North Carolina"],
  ["Teddy E Beecher|2839 Hartland Avenue|Fond Du Lac Wisconsin|US"],
  ["Philippe  Schauss|1 Im Oberdor|Allemagne"],
 ["Meindert I Tholen|Hagedoornweg 138|Amsterdam|NL"]
]).toDF("s")

Я уже пробовал это:

разделение, подстрока размера, но не могу это сделать . Любая помощь очень ценится!

Ожидаемый результат:

addres
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
2363  Ryan Road"
2263 Patton Lane|Raleigh North Carolina"
2839 Hartland Avenue|Fond Du Lac Wisconsin|US"
1 Im Oberdor|Allemagne"
Hagedoornweg 138|Amsterdam|NL"

Ответы [ 2 ]

2 голосов
/ 14 июля 2020

Функция 'instr' может использоваться для поиска первого '|', а 'substring' для получения результата:

df1.selectExpr(
  "substring(s, instr(s,'|') + 1, length(s))"
)

Или регулярное выражение от начала строки до первого '|':

df1.select(
  regexp_replace($"s", "^[^\\|]+\\|", "")
)
2 голосов
/ 14 июля 2020

Попробуйте это

df1.select(concat_ws('|',slice(split('s','\|'),2,1000))).show()

+------------------------------------------+
|concat_ws(|, slice(split(s, \|), 2, 1000))|
+------------------------------------------+
|2363  Ryan Road|Long Lake South Dakota    |
|2263 Patton Lane|Raleigh North Carolina   |
|2839 Hartland Avenue|Fond Du Lac Wisconsin|
|1 Im Oberdor|Allemagne                    |
|Hagedoornweg 138|Amsterdam                |
+------------------------------------------+

, где 1000 - это max_length вашего массива с учетом произвольного большого int на данный момент.

...