Присвойте значение определенной ячейке в PySpark dataFrame - PullRequest
0 голосов
/ 17 мая 2018

Я хочу изменить значение в определенной ячейке моего Spark DataFrame, используя PySpark.

Простой пример - я создаю макет Spark DataFrame:

df = spark.createDataFrame(
    [
     (1, 1.87, 'new_york'), 
     (4, 2.76, 'la'), 
     (6, 3.3, 'boston'), 
     (8, 4.1, 'detroit'), 
     (2, 5.70, 'miami'), 
     (3, 6.320, 'atlanta'), 
     (1, 6.1, 'houston')
    ],
    ('variable_1', "variable_2", "variable_3")
)

Runnningdisplay(df) Я получаю эту таблицу:

variable_1   variable_2   variable_3
    1           1.87    new_york
    4           2.76    la
    6           3.3     boston
    8           4.1     detroit
    2           5.7     miami
    3           6.32    atlanta
    1           6.1     houston

Допустим, например, я хотел бы назначить новое значение для ячейки в 4-й строке и 3-м столбце, т.е. изменить detroit для new_orleans.Я знаю, что назначения df.iloc[4, 3] = 'new_orleans' или df.loc[4, 'detroit'] = 'new_orleans' недействительны в Spark.

Правильный ответ на мой вопрос с использованием when будет:

from pyspark.sql.functions import when
targetDf = df.withColumn("variable_3", \
              when(((df["variable_1"] == 8) & (df["variable_2"] == 4.1)) , 'new_orleans').otherwise(df["variable_3"]))

Мой вопрос: можно ли сделать это более практичным способом в PySpark без необходимости вводавсе значения и имена столбцов строки, в которой я хочу изменить только одну отдельную ячейку (возможно, достигнуть того же самого без использования функции when)?

Заранее спасибо за вашу помощь и @ useruser9806664 за его отзыв.

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Вы можете создать номер строки, используя базовый СДР:

from pyspark.sql import Row

# Function to update dataframe row with a rownumber
def create_rownum(ziprow):
    row, index=ziprow
    row=row.asDict()
    row['rownum']= index
    return(Row(**row))

# First create a rownumber then add to dataframe
df.rdd.zipWithIndex().map(create_rownum).toDF().show()

Теперь вы можете отфильтровать DataFrame для получения нужного номера строки.

0 голосов
/ 17 мая 2018

Spark DataFrames являются неизменяемыми , не обеспечивают произвольный доступ и, строго говоря, неупорядочены . В результате:

  • Вы ничего не можете назначить (потому что неизменное свойство).
  • Вы не можете получить доступ к определенной строке (потому что нет произвольного доступа).
  • "Индексы" строк не определены четко (потому что неупорядочены).

Что вы можете сделать, это создать новый фрейм данных с новым столбцом, заменив существующий, используя некоторое условное выражение, которое уже покрыто найденными вами ответами.

Кроме того, monotonically_increasing_id не добавляет индексы (номера строк). Он добавляет монотонно увеличивающиеся числа, не обязательно последовательные или начинающиеся с какого-либо конкретного значения (в случае пустых разделов).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...