2016-09-30 2 views
0

У меня есть Spark 2.0.0 Dataset с колонкой Foo объектов, например, val ds: Dataset[(int, Foo, int)]. Bar - экстрактор Foo. Я хотел бы иметь возможность добавить столбец, построенный с использованием оператора match-case (или любого произвольно сложного оператора). Что-то вроде этого: ds.withColumn("extracted", $"_2" match { case Bar(x) => x }). Каков наилучший способ добиться такого поведения в Spark?Применить матч-кейс в колонку искры?

Update:
@ T.Gawęda и @ zero323 - Спасибо вам обоим за ваши содержательные комментарии. Я думаю, что мой ответ кроется в этом предложении: «Невозможно погладить матч за Column, чтобы извлечь данные». Я действительно использовал Dataset[Row], но я слишком упростил до Dataset[(int, Foo, int)]. Причина, по которой я склонялся к использованию withColumn, а не map, был потому, что (1) я пытался избежать ссылки на любой из других столбцов (они не фигурировали в функции совпадения), и (2) я хотел ссылаться на Foo/Bar по имени (поскольку местоположение столбца в было неизвестно).

ответ

2

Вы также можете использовать map, так же, как в РДУ:

val dsWithExtracted = ds.map { 
    case (x, Bar(y), z) => (x, y, z) 
} 

Edit: withColumn не будет работать, будет возвращать правильный тип, но не в состоянии во время выполнения

+0

Это не сработает. UDF получит тип SQL, а не 'Bar'. «Карта» будет работать, конечно. – zero323

+0

@ zero323 проверить мой пример, я запустил его, и он работает. Я что-то пропустил? –

+0

Одна вещь, попробуйте выполнить это :) ('show',' first'). Здесь существует безопасность типов, поэтому он просто не работает во время выполнения. – zero323

4

Если вы статически типизированных Dataset и вы хотите, чтобы выполнить произвольные сложные операции, почему бы просто не использовать map:

ds.map { case (first, Bar(x), last) => ??? } 

withColumn предназначен для работы на DataFrames/Datasets[Row], и для извлечения данных невозможно выполнить паттен по сравнению с Column.

Column - это больше функция, которая будет применяться к конкретному набору данных, чем что-либо еще.

+0

Подтверждено, будет работать. Спасибо, что объяснил, что было не так в моем ответе :) –

+0

@ T.Gawęda Мое удовольствие. Если вы исправите это, я с удовольствием проголосую и даже удалю этот. Что касается UDF, вы можете увидеть проблему, когда смотрите на возвращаемый тип. – zero323

+1

Не удаляйте это, как только вы были правы. Мое удовольствие, чтобы поддержать, вот как сообщество должно работать :) Даже человек, который отвечает, может чему-то научиться –