У меня есть сериализованный блоб и функция, которая преобразует его в java-карту. Я зарегистрировал функцию как UDF и попытался использовать ее в Spark SQL следующим образом:
sqlCtx.udf.register("blobToMap", Utils.blobToMap)
val df = sqlCtx.sql(""" SELECT mp['c1'] as c1, mp['c2'] as c2 FROM
(SELECT *, blobToMap(payload) AS mp FROM t1) a """)
Мне это удается, но по какой-то причине очень тяжелая функция blobToMap
запускается дважды для каждой строки, а на самом деле я извлекаю 20 полей, и она запускается 20 раз для каждой строки. Я видел предложения в Получить несколько столбцов из один столбец в Spark DataFrame, но они действительно не масштабируются — я не хочу создавать класс каждый раз, когда мне нужно извлечь данные.
Как я могу заставить Spark делать то, что разумно? Я попытался разделить на два этапа. Единственное, что сработало, - это кэшировать внутренний выбор, но это тоже невозможно, потому что это действительно большой двоичный объект, и мне нужно от него всего несколько десятков полей.