62
задан 23 June 2017 в 00:02

4 ответа

В то время как Вы не можете изменить столбец как таковой, можно воздействовать на столбец и возвратить новый 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.

62
ответ дан 31 October 2019 в 13:52

Обычно при обновлении столбца, мы хотим отобразить старое значение на новое значение. Вот способ сделать это в 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])).
39
ответ дан 31 October 2019 в 13:52

Так же, как группы военных советников заявляют, что можно создать новый 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")
11
ответ дан 31 October 2019 в 13:52

DataFrames основаны на RDDs. RDDs являются неизменными структурами и не позволяют обновлять элементы на месте. Для изменения значений необходимо будет создать новый DataFrame путем преобразования исходного или использования подобного SQL DSL или операций RDD как map.

А настоятельно рекомендованная дека слайда: Представление DataFrames в Spark для Крупномасштабной Науки о данных .

13
ответ дан 31 October 2019 в 13:52

Другие вопросы по тегам:

Похожие вопросы: