Создать новый dataFrame на основе переформатированных столбцов из старого dataFrame - PullRequest
0 голосов
/ 06 июля 2018

Я импортировал данные из базы данных

df = spark.read.format("com.mongodb.spark.sql.DefaultSource").option("uri",
"mongodb://127.0.0.1/test.db").load()

Я выбрал двойные столбцы, используя

double_list = [name for name,types in df.dtypes if types == 'double']

Кредиты @Ramesh Maharjan. Для удаления специальных символов мы используем

removedSpecials = [''.join(y for y in x if y.isalnum()) for x in double_list]

Вопрос:

Как создать новый фрейм данных на основе df с ТОЛЬКО double_list столбцами.

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Если у вас уже есть список имен столбцов с двойным типом данных , то следующий шаг - удалить специальные символы, которые можно сделать, используя .isalnum() credit как

removedSpecials = [''.join(y for y in x if y.isalnum()) for x in double_list]

как только вы удалите список имен столбцов из специальных символов, просто вызовите .withColumnRenamed() api как

for (x, y) in zip(double_list, removedSpecials):
    df = df.withColumnRenamed(x, y)

df.show(truncate=False) должен дать вам переименованный фрейм данных в столбцах с двойным типом данных

Если вы не хотите, чтобы столбцы отсутствовали в double_list, то есть не были в списке двойных типов данных, вы можете использовать select как

df.select(*removedSpecials).show(truncate=False)

причина сделать

for (x, y) in zip(double_list, removedSpecials):
    df = df.withColumnRenamed(x, y) 

перед тем как сделать

df.select(*removedSpecials).show(truncate=False)

в том, что могут быть специальные символы , такие как ., которые не дают кратких решений, таких как df.select([df[x].alias(y) for (x, y) in zip(double_list, removedSpecials)]).show(truncate=False) для работы

Надеюсь, ответ полезен

0 голосов
/ 06 июля 2018

Scala-код, вы можете конвертировать в Python

import sqlContext.implicits._
// sample df
df.show()
+----+--------------------+--------+
|data|                Week|NumCCol1|
+----+--------------------+--------+
| aac|01/28/2018-02/03/...|     2.0|
| aac|02/04/2018-02/10/...|    23.0|
| aac|02/11/2018-02/17/...|   105.0|
+----+--------------------+--------+

df.printSchema()

root
 |-- data: string (nullable = true)
 |-- Week: string (nullable = true)
 |-- NumCCol1: double (nullable = false)

 val df1 = df.schema.fields
      .collect({case x if x.dataType.typeName == "double" => x.name})
      .foldLeft(df)({case(dframe,field) => dframe.select(field)})

 // df with only double columns
 df1.show()

используйте df1.withColumnRenamed для переименования столбцов

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