Удалить столбец, содержащий определенные значения в нескольких строках в Pyspark - PullRequest
0 голосов
/ 10 июля 2020

Итак, у меня есть фреймворк pyspark, он содержит 12 строк и 50 столбцов. Я хочу удалить столбцы, содержащие более 4 строк.

Однако ответы в приведенном выше вопросе относятся только к pandas. Есть ли решение для фрейма данных pyspark?

Ответы [ 2 ]

1 голос
/ 10 июля 2020

Вы можете сделать следующее:

# Creates test data. Field called "col5" won't match 
# the criteria set on the function "check_number"
df1 = spark.sql("select 1 col1, 4 col2, 0 col3, 1 col4, 0 col5")
df2 = spark.sql("select 2 col1, 9 col2, 5 col3, 7 col4, 0 col5")
df3 = spark.sql("select 3 col1, 2 col2, 6 col3, 5 col4, 0 col5")
df4 = spark.sql("select 4 col1, 7 col2, 7 col3, 3 col4, 1 col5")

df = df1.union(df2).union(df3).union(df4)
df.createOrReplaceTempView("df")

print("Original dataframe")
df.show()

# Please change the criteria to filter whatever you need. In this case this sample 
# returns true on the columns that have less than 2 zeros
def check_number(column_name):
    return spark.sql("select count(" + column_name + ") from df where " + column_name + " = 0").take(1)[0][0] < 2

fields = [x.name for x in df.schema.fields if check_number(x.name)]

print("After filtering dataframe")
df.select(fields).show()

В функции check_number вы можете разместить любые критерии.

Результат будет

Original dataframe
+----+----+----+----+----+
|col1|col2|col3|col4|col5|
+----+----+----+----+----+
|   1|   4|   0|   1|   0|
|   2|   9|   5|   7|   0|
|   3|   2|   6|   5|   0|
|   4|   7|   7|   3|   1|
+----+----+----+----+----+

After filtering dataframe
+----+----+----+----+
|col1|col2|col3|col4|
+----+----+----+----+
|   1|   4|   0|   1|
|   2|   9|   5|   7|
|   3|   2|   6|   5|
|   4|   7|   7|   3|
+----+----+----+----+

Как вы видите, я использую PySpark в сочетании с SQL

1 голос
/ 10 июля 2020

В pyspark вам нужно будет ввести количество нулей в каждом столбце в драйвер с помощью collect (). С точки зрения памяти это не должно быть большой проблемой, потому что у вас будет одно значение для каждого столбца. Попробуйте это,

from pyspark.sql import functions as F
tst= sqlContext.createDataFrame([(1,0,0),(1,0,4),(1,0,10),(2,1,90),(7,2,0),(0,3,11)],schema=['group','order','value'])
expr = [F.count(F.when(F.col(coln)==0,1)).alias(coln) for coln in tst.columns]
tst_cnt = tst.select(*expr).collect()[0].asDict()
#%%
sel_coln =[x for x in tst_cnt.keys() if tst_cnt[x]<=2]
tst_final = tst.select(sel_coln)

Я думаю, в синтаксисе sql вы можете сделать это в подзапросе.

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