我们有一个数据框:
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")
但空列正在引起问题。
答案 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.
我希望这就是你想要的。