импортировать данные со столбцом типа Pig Map в spark Dataframe? - PullRequest
0 голосов
/ 01 марта 2019

Итак, я пытаюсь импортировать данные, в которых есть столбец типа Pig map, в фрейм данных spark, и я не смог найти ничего о том, как мне разбить данные карты на 3 столбца с именами: улица, город и штат,Я, наверное, ищу не ту вещь.Прямо сейчас я могу импортировать их в 3 столбца, используя параметры StructType и StructField.

val schema = StructType(Array(
   StructField("id", IntegerType, true),
   StructField("name", StringType, true),
   StructField("address", StringType, true))) #this is the part that I need to explode


val data = sqlContext.read.format("com.databricks.spark.csv")
     .option("header", "false")
     .option("delimiter", ";")
     .schema(schema)
     .load("hdfs://localhost:8020/filename")

Пример строки данных, из которой мне нужно сделать 5 столбцов из:

328;Some Name;[street#streetname,city#Chicago,state#IL]

Что мне делатьнужно сделать, чтобы разбить карту на 3 столбца, чтобы у id был принципиально новый фрейм данных с 5 столбцами?Я только начал Spark, и я никогда не использовал свинью.Я только выяснил, что это была свиная карта в результате поиска в структуре [key # value].

Кстати, я использую spark 1.6 со Scala.Спасибо за любую помощь.

1 Ответ

0 голосов
/ 01 марта 2019

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

val data = spark.createDataset(Seq(
(328, "Some Name", "[street#streetname,city#Chicago,state#IL]")
)).toDF("id", "name", "address")

data.as[(Long, String, String)].map(r => {
    val addr = (r._3.substring(1, r._3.length - 1)).split(",")
    val street = addr(0).split("#")(1)
    val city = addr(1).split("#")(1)
    val state = addr(2).split("#")(1)
    (r._1, r._2, street, city, state)
}).toDF("id", "name", "street", "city", "state").show()

, что приводит к

+---+---------+----------+-------+-----+
| id|     name|    street|   city|state|
+---+---------+----------+-------+-----+
|328|Some Name|streetname|Chicago|   IL|
+---+---------+----------+-------+-----+

Я не уверен на 100%совместимости с искрой 1.6, однако.Вам может понадобиться отобразить Dataframe (в отличие от Dataset, поскольку я конвертирую его с помощью вызова .as[]) и извлечь отдельные значения из объекта Row в вашем анонимном .map()функция.Общая концепция должна быть одинаковой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...