Как убрать пустые столбцы из фрейма данных pyspark - PullRequest
2 голосов
/ 10 января 2020

имя данных

у нас есть кадр данных:

names = spark.read.csv("name.csv", header="true", inferSchema="true").rdd

Я хочу сделать это:

res=names.filter(lambda f: f['Name'] == "Diwakar").map(lambda name: (name['Name'], name['Age']))
res.toDF(['Name','Age']).write.csv("final", mode="overwrite", header="true")

, но пустая колонка создает проблему.

Ответы [ 3 ]

4 голосов
/ 10 января 2020

Просто используйте простое выделение, я предполагаю, что пустые столбцы равны "".

для ввода

df = sqlContext.createDataFrame([(1,"", "x"," "), (2,"", "b"," "), (5,"", "c"," "), (8,"", "d"," ")], ("st"," ", "ani"," "))

+---+---+---+---+
| st|   |ani|   |
+---+---+---+---+
|  1|   |  x|   |
|  2|   |  b|   |
|  5|   |  c|   |
|  8|   |  d|   |
+---+---+---+---+

a=list(set(df.columns))
a.remove(" ")
df=df.select(a)
df.show()

+---+---+
|ani| st|
+---+---+
|  x|  1|
|  b|  2|
|  c|  5|
|  d|  8|
+---+---+
""" 
Do your Operations
"""

после выполнения вышеуказанного шага go для вашей задачи. это удалит пустые столбцы

Новое редактирование:

Нет такого способа отбросить пустые столбцы во время чтения, вы должны сделать это самостоятельно.

Вы можете сделать это так:

a = list(set(df.columns))
new_col = [x for x in a if not x.startswith("col")] #or what ever they start with

df=df.select(new_col)
1 голос
/ 11 января 2020
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("Test_Parquet").master("local[*]").getOrCreate()
names = spark.read.csv("name.csv", header="true", inferSchema="true")
names.show()
temp = list(names.columns)
print(temp)
temp.remove(" 1")
temp.remove(" 3")
temp.remove("_c5")
print(temp)
names = names.select(temp)
names.show()

, если вы создадите фрейм данных при использовании read.csv, тогда spark автоматически даст имя по умолчанию для безымянного столбца, и вам придется явно удалить столбец. Но он выдает следующую ошибку:

CSV header does not conform to the schema.
 Header: Name,  , Age,  , Class, 
 Schema: Name,  1, Age,  3, Class, _c5

и теперь вы можете продолжить работу.

0 голосов
/ 10 января 2020

Если вы хотите удалить данные с пустыми строками во фрейме данных pyspark:

newDF = oldDF.filter("colName != ''").

В вашем случае вы можете отфильтровать начальный фрейм данных names и примените ваши условия:

res=names.filter("Name != ''") # I have applied filter on 'Name' column of your data.

Я надеюсь, что это то, что вы хотели.

...