我需要将多个列附加到现有的spark dataframe,其中列名称在列表中给定,假设新列的值是常量,例如给定的输入列和dataframe是
val columnsNames=List("col1","col2")
val data = Seq(("one", 1), ("two", 2), ("three", 3), ("four", 4))
并且在附加两列后,假设 col1 的常量值为“val1”,col2 的常量值为“val2”,则输出数据帧应为
+-----+---+-------+------+
| _1| _2|col1 |col2|
+-----+---+-------+------+
| one| 1|val1 |val2|
| two| 2|val1 |val2|
|three| 3|val1 |val2|
| four| 4|val1 |val2|
+-----+---+-------+------+
我已经编写了一个函数来追加列
def appendColumns (cols: List[String], ds: DataFrame): DataFrame = {
cols match {
case Nil => ds
case h :: Nil => appendColumns(Nil, ds.withColumn(h, lit(h)))
case h :: tail => appendColumns(tail, ds.withColumn(h, lit(h)))
}
}
有没有更好的方式,更具功能性的方式去做。
谢啦
与递归相反,我认为使用foldLeft的更一般的方法对于有限数量的列会更通用。使用数据砖笔记本:
import org.apache.spark.sql._
import org.apache.spark.sql.functions._
import spark.implicits._
val columnNames = Seq("c3","c4")
val df = Seq(("one", 1), ("two", 2), ("three", 3), ("four", 4)).toDF("c1", "c2")
def addCols(df: DataFrame, columns: Seq[String]): DataFrame = {
columns.foldLeft(df)((acc, col) => {
acc.withColumn(col, lit(col)) })
}
val df2 = addCols(df, columnNames)
df2.show(false)
返回:
+-----+---+---+---+
|c1 |c2 |c3 |c4 |
+-----+---+---+---+
|one |1 |c3 |c4 |
|two |2 |c3 |c4 |
|three|3 |c3 |c4 |
|four |4 |c3 |c4 |
+-----+---+---+---+
请注意以下内容:https://medium . com/@ manu Zhang/the-hidden-cost-of-spark-with column-8 ffea 517 c 015尽管上下文略有不同,另一个答案通过select方法暗示了这一点。
是的,有一种更好、更简单的方法。基本上,您对with Colzo
的调用与您拥有的列一样多。有了大量的列、催化剂,优化火花查询的引擎可能会感到有点不知所措(我过去有过类似用例的经验)。我甚至见过它在尝试数千列时在驱动程序上导致OOM。为了避免对催化剂施加压力(并编写更少的代码 ;-) ), 您可以简单地使用下面的select
在一个火花命令中完成此操作:
val data = Seq(("one", 1), ("two", 2), ("three", 3), ("four", 4)).toDF
// let's assume that we have a map that associates column names to their values
val columnMap = Map("col1" -> "val1", "col2" -> "val2")
// Let's create the new columns from the map
val newCols = columnMap.keys.map(k => lit(columnMap(k)) as k)
// selecting the old columns + the new ones
data.select(data.columns.map(col) ++ newCols : _*).show
+-----+---+----+----+
| _1| _2|col1|col2|
+-----+---+----+----+
| one| 1|val1|val2|
| two| 2|val1|val2|
|three| 3|val1|val2|
| four| 4|val1|val2|
+-----+---+----+----+
我正在尝试访问配置单元表,并从表/数据帧中提取和转换某些列,然后将这些新列放入新的数据帧中。我试着用这种方式- 它使用SBT构建时没有任何错误。但当我尝试运行它时,我收到以下错误- 我想了解是什么导致了这个错误,如果有任何其他的方法来完成我正在尝试做的事情。
我试图做的是从列“in_reply_to_user_id”(不在图片中,因为df太宽,无法容纳)与给定id具有相同值的行中获取文本,并将文本附加到列表中,然后将其放入新列中。例如,所有tweet中的“in_reply_to_user_id”列等于第一条tweet的“id”的文本都应该放在一个列表中,然后添加到数据框中名为“reples”的新列中。以下是我尝试过的一些事情:
我正在实施一个项目,其中MySql数据被导入到hdfs使用sqoop。它有将近30张桌子。我通过推断模式和注册为临时表来读取每个表作为数据帧。我做这件事有几个问题...1.假设df1到df10的表需要实现几个连接。在MySQL中,查询将是而不是使用是否有其他连接所有数据帧有效地基于条件...
问题内容: 我需要更新表名(col1name) 如果已经有数据,我需要将其附加值’a,b,c’如果为NULL,则需要添加值’a,b,c’ 我知道有一个CONCAT参数,但是不确定SQL语法是什么。 以上正确吗? 问题答案: 试试这个查询: 请参阅此sql小提琴演示。
我的清单如下: 我需要将上面列表中的数据添加到下面的列表中,其中第0行应该有值test1和test2。第1行应该有test3和test4
所以我已经初始化了一个空的熊猫数据帧,我想在这个数据帧中迭代地追加列表(或系列)作为行。最好的方法是什么?