将相同的功能应用于 spark 数据帧行的所有字段
Apply same function to all fields of spark dataframe row
我有一个数据框,其中有大约 1000 多列(变量)。
我想将所有值都设为大写。
这是我想到的方法,你能推荐一下这是否是最好的方法吗?
- 取行
- 查找架构并将其存储在数组中,然后查找其中有多少个字段。
- 映射数据框中的每一行并达到数组中元素数量的限制
- 将函数应用于大写的每个字段和return行
如果您只是想将相同的函数应用于所有列,这样的事情就足够了:
import org.apache.spark.sql.functions.{col, upper}
val df = sc.parallelize(
Seq(("a", "B", "c"), ("D", "e", "F"))).toDF("x", "y", "z")
df.select(df.columns.map(c => upper(col(c)).alias(c)): _*).show
// +---+---+---+
// | x| y| z|
// +---+---+---+
// | A| B| C|
// | D| E| F|
// +---+---+---+
或 Python
from pyspark.sql.functions import col, upper
df = sc.parallelize([("a", "B", "c"), ("D", "e", "F")]).toDF(("x", "y", "z"))
df.select(*(upper(col(c)).alias(c) for c in df.columns)).show()
## +---+---+---+
## | x| y| z|
## +---+---+---+
## | A| B| C|
## | D| E| F|
## +---+---+---+
另请参阅:
我需要做类似的事情,但必须编写自己的函数来将数据框中的空字符串转换为 null。这就是我所做的。
import org.apache.spark.sql.functions.{col, udf}
import spark.implicits._
def emptyToNull(_str: String): Option[String] = {
_str match {
case d if (_str == null || _str.trim.isEmpty) => None
case _ => Some(_str)
}
}
val emptyToNullUdf = udf(emptyToNull(_: String))
val df = Seq(("a", "B", "c"), ("D", "e ", ""), ("", "", null)).toDF("x", "y", "z")
df.select(df.columns.map(c => emptyToNullUdf(col(c)).alias(c)): _*).show
+----+----+----+
| x| y| z|
+----+----+----+
| a| B| c|
| D| e |null|
|null|null|null|
+----+----+----+
这里有一个更完善的 emptyToNull 函数,它使用选项而不是 null。
def emptyToNull(_str: String): Option[String] = Option(_str) match {
case ret @ Some(s) if (s.trim.nonEmpty) => ret
case _ => None
}
我有一个数据框,其中有大约 1000 多列(变量)。
我想将所有值都设为大写。
这是我想到的方法,你能推荐一下这是否是最好的方法吗?
- 取行
- 查找架构并将其存储在数组中,然后查找其中有多少个字段。
- 映射数据框中的每一行并达到数组中元素数量的限制
- 将函数应用于大写的每个字段和return行
如果您只是想将相同的函数应用于所有列,这样的事情就足够了:
import org.apache.spark.sql.functions.{col, upper}
val df = sc.parallelize(
Seq(("a", "B", "c"), ("D", "e", "F"))).toDF("x", "y", "z")
df.select(df.columns.map(c => upper(col(c)).alias(c)): _*).show
// +---+---+---+
// | x| y| z|
// +---+---+---+
// | A| B| C|
// | D| E| F|
// +---+---+---+
或 Python
from pyspark.sql.functions import col, upper
df = sc.parallelize([("a", "B", "c"), ("D", "e", "F")]).toDF(("x", "y", "z"))
df.select(*(upper(col(c)).alias(c) for c in df.columns)).show()
## +---+---+---+
## | x| y| z|
## +---+---+---+
## | A| B| C|
## | D| E| F|
## +---+---+---+
另请参阅:
我需要做类似的事情,但必须编写自己的函数来将数据框中的空字符串转换为 null。这就是我所做的。
import org.apache.spark.sql.functions.{col, udf}
import spark.implicits._
def emptyToNull(_str: String): Option[String] = {
_str match {
case d if (_str == null || _str.trim.isEmpty) => None
case _ => Some(_str)
}
}
val emptyToNullUdf = udf(emptyToNull(_: String))
val df = Seq(("a", "B", "c"), ("D", "e ", ""), ("", "", null)).toDF("x", "y", "z")
df.select(df.columns.map(c => emptyToNullUdf(col(c)).alias(c)): _*).show
+----+----+----+
| x| y| z|
+----+----+----+
| a| B| c|
| D| e |null|
|null|null|null|
+----+----+----+
这里有一个更完善的 emptyToNull 函数,它使用选项而不是 null。
def emptyToNull(_str: String): Option[String] = Option(_str) match {
case ret @ Some(s) if (s.trim.nonEmpty) => ret
case _ => None
}