В то время как Вы не можете изменить столбец как таковой, можно воздействовать на столбец и возвратить новый DataFrame, отражающий то изменение. Для этого Вы сначала создали бы UserDefinedFunction
реализация операции, чтобы применить и затем выборочно применить ту функцию к целенаправленному столбцу только. В Python:
from pyspark.sql.functions import UserDefinedFunction
from pyspark.sql.types import StringType
name = 'target_column'
udf = UserDefinedFunction(lambda x: 'new_value', StringType())
new_df = old_df.select(*[udf(column).alias(name) if column == name else column for column in old_df.columns])
new_df
теперь имеет ту же схему как old_df
(предполагающий, что old_df.target_column
имел тип StringType
также), но все значения в столбце target_column
будут new_value
.
Обычно при обновлении столбца, мы хотим отобразить старое значение на новое значение. Вот способ сделать это в pyspark без UDF's:
# update df[update_col], mapping old_value --> new_value
from pyspark.sql import functions as F
df = df.withColumn(update_col,
F.when(df[update_col]==old_value,new_value).
otherwise(df[update_col])).
Так же, как группы военных советников заявляют, что можно создать новый DataFrame из результата карты, относился к старому DataFrame. Пример для данного Кадра данных df
с двумя строками:
val newDf = sqlContext.createDataFrame(df.map(row =>
Row(row.getInt(0) + SOMETHING, applySomeDef(row.getAs[Double]("y")), df.schema)
Примечание это, если типы изменения столбцов, необходимо дать ему корректную схему вместо df.schema
. Проверьте API org.apache.spark.sql.Row
для доступных методов: https://spark.apache.org/docs/latest/api/java/org/apache/spark/sql/Row.html
[Обновление] Или использующий UDFs в Scala:
import org.apache.spark.sql.functions._
val toLong = udf[Long, String] (_.toLong)
val modifiedDf = df.withColumn("modifiedColumnName", toLong(df("columnName"))).drop("columnName")
и если имя столбца должно остаться таким же, можно переименовать его назад:
modifiedDf.withColumnRenamed("modifiedColumnName", "columnName")
DataFrames
основаны на RDDs. RDDs являются неизменными структурами и не позволяют обновлять элементы на месте. Для изменения значений необходимо будет создать новый DataFrame путем преобразования исходного или использования подобного SQL DSL или операций RDD как map
.
А настоятельно рекомендованная дека слайда: Представление DataFrames в Spark для Крупномасштабной Науки о данных .