Как применить функцию к каждой строке в фрейме данных

#scala #apache-spark #apache-spark-sql

Вопрос:

 {  "cars": {  "Nissan": {  "Sentra": {"doors":4, "transmission":"automatic"},  "Maxima": {"doors":4, "transmission":"automatic","colors":["b#lack","pin###k"]}  },  "Ford": {  "Taurus": {"doors":4, "transmission":"automatic"},  "Escort": {"doors":4, "transmission":"auto#matic"}  }  } }  

У меня есть этот JSON, который я прочитал, и я хочу удалить каждый символ # в каждой строке, которая может существовать. Моя проблема заключается в том, что эта функция универсальна, поэтому она может работать со всеми схемами, с которыми я могу столкнуться, а не только с этой схемой, используемой в JSON выше.

Комментарии:

1. где находится фрейм данных?

Ответ №1:

Вы могли бы сделать что-то вроде этого: получить все поля из схемы, использовать fold с DataFrame самим собой в качестве аккумулятора и применить функцию, которую вы хотите

 def replaceSymbol(df: DataFrame): DataFrame =  df.schema.fieldNames.foldLeft(df)((df, field) =gt; df.withColumn(field, regexp_replace(col(field), "#", "")))  

Возможно, вам потребуется проверить, является ли столбец строковым или нет.

Комментарии:

1. Я думаю, что это не сработало бы для вложенных полей