如何从pyspark的数据框中删除空列

时间:2020-01-10 06:23:40

标签: pyspark pyspark-dataframes

name data

我们有一个数据框:

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 个答案:

答案 0 :(得分:4)

只需使用简单的选择, 我假设空列是“”。

用于输入

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
"""

完成上述步骤后,继续执行任务。这将删除空白列

新编辑:

没有这种方法可以在阅读时删除空列,您必须自己做。

您可以这样做:

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 :(得分:1)

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

现在您可以继续工作。

答案 2 :(得分:0)

如果要删除pyspark数据框中具有空行的数据,请执行以下操作:

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

根据您的情况,您可以过滤初始names数据框并应用您的条件:

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

我希望这就是你想要的。