根据旧dataFrame中重新格式化的列创建新的dataFrame

时间:2018-07-06 09:03:22

标签: python apache-spark pyspark

我从数据库导入了数据

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

如果您已经具有带有双精度列类型的列名称列表,那么下一步就是删除特殊字符,可以通过使用.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中的列(即不在double数据类型列表中),则可以使用select as

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)这样的简洁解决方案起作用

我希望答案会有所帮助

答案 1 :(得分:0)

scala代码,您可以将其转换为python

"DefaultConnection": "Server=firstdb123.database.windows.net;Database=TestDB;User Id={username};Password={password};MultipleActiveResultSets=true"

使用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() 重命名列