我从数据库导入了数据
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
列来创建新的数据框。 ?
答案 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()
重命名列