Вам понадобится немного разбора строки ad-ho c, потому что я не думаю, что есть встроенный парсер, который делает именно то, что вы хотите. Я надеюсь, что вы уверены в своем формате и в том, что специальные символы (|
, :
и ;
) не появляются в ваших полях, потому что это все испортило бы.
учитывая, что вы получите свой результат с помощью пары простых split
s и explode
, чтобы поместить каждое свойство в словарь в разные строки.
val raw_df = sc.parallelize(List("1|name:abc;org:tec;salary:5000", "2|org:Ja;Designation:Lead"))
.map(_.split("\\|") )
.map(a => (a(0),a(1))).toDF("ID", "value")
raw_df
.select($"ID", explode(split($"value", ";")).as("key_value"))
.select($"ID", split($"key_value", ":").as("key_value"))
.select($"ID", $"key_value"(0).as("property"), $"key_value"(1).as("value"))
.show
result:
+---+-----------+-----+
| ID| property|value|
+---+-----------+-----+
| 1| name| abc|
| 1| org| tec|
| 1| salary| 5000|
| 2| org| Ja|
| 2|Designation| Lead|
+---+-----------+-----+
Редактировать: альтернативно, вы можете использовать функцию from_json
(https://spark.apache.org/docs/latest/api/scala/index.html#org. apache .spark. sql .functions $) в поле значения для его анализа. Однако вам все равно нужно разбить результат на отдельные строки и распределить каждый элемент результирующего объекта в нужном столбце. С простым примером, который вы привели, это не будет проще и, следовательно, сводится к вопросу вкуса.