2016-09-27 2 views
0

Я хочу изменить свойство nullable для определенного столбца в DataFrame Spark.Исправлена ​​ошибка смены значения столбца Spark Dataframe

Если я печатаю схему данных в настоящее время, она выглядит ниже. col1: string (nullable = false) col2: string (nullable = true) col3: string (nullable = false) col4: float (nullable = true)

Я просто хочу, чтобы значение null для null было обновлено. col1: string (nullable = false) col2: string (nullable = true) col3: string (nullable = true) col4: float (nullable = true)

Я проверил онлайн здесь несколько ссылок, но похоже, что они делают это для всех столбцов, но не для определенного столбца. Change nullable property of column in spark dataframe Может кто-нибудь, пожалуйста, помогите мне в этом отношении.

+0

Я выполняю некоторые действия по одному столбцу, используя .withColumn. После этого я выполнил printSchema, а затем в схеме я заметил, что значение nullable обновляется по умолчанию как nullable = true. Как я могу контролировать это значение с нулевым значением (true или false). – Ramesh

+0

В общем значении атрибута «nullable» определяется семантикой ввода (примитивы/вложенные примитивы/параметр) или выполняемая вами функция. Поэтому здесь важно какое-то действие. – zero323

ответ

2

Существует нет «четкого» способа сделать это. Вы можете использовать трюк как here

Соответствующий код из этого ответа:

def setNullableStateOfColumn(df: DataFrame, cn: String, nullable: Boolean) : DataFrame = { 

    // get schema 
    val schema = df.schema 
    // modify [[StructField] with name `cn` 
    val newSchema = StructType(schema.map { 
    case StructField(c, t, _, m) if c.equals(cn) => StructField(c, t, nullable = nullable, m) 
    case y: StructField => y 
    }) 
    // apply new schema 
    df.sqlContext.createDataFrame(df.rdd, newSchema) 
} 

Это будет копировать DataFrame и скопировать схему, но с specyfying NULLABLE программно

Версия для многих колонок:

def setNullableStateOfColumn(df: DataFrame, nullValues: Map[String, Boolean]) : DataFrame = { 

    // get schema 
    val schema = df.schema 
    // modify [[StructField]s with name `cn` 
    val newSchema = StructType(schema.map { 
    case StructField(c, t, _, m) if nullValues.contains(c) => StructField(c, t, nullable = nullValues.get(c), m) 
    case y: StructField => y 
    }) 
    // apply new schema 
    df.sqlContext.createDataFrame(df.rdd, newSchema) 
} 

Использование: setNullableStateOfColumn (df1, Map ("col1" -> true, "col2" -> true, "col7" -> false));

+0

Я так думаю, я не могу изменить значение nullable только одного конкретного столбца из фрейма данных. – Ramesh

+0

Технически вы не меняетесь, но создаете новый набор данных с новой схемой. Посмотрите на строку с 'case StructField' - имя столбца' if' равно имени столбца из аргумента, а затем задайте значение nullability, заданное параметром. Если нет, данные столбца будут скопированы –

+0

Итак, если у меня есть 4 столбца в фрейме данных, и мне пришлось изменить значение NULL для одного столбца. val df2 = df1.withColumn («col1», udfname (df1, «col1», true)), а затем мне нужно вызвать этот метод «setNullableStateOfColumn» через функцию udf, которую я создал? – Ramesh

Смежные вопросы