当前位置: 首页 > 知识库问答 >
问题:

Spark Dataframe/RDD无法通过计算另一列的内容来创建新列

海叶秋
2023-03-14

我有一个火花RDD(或Dataframe-转换成任何一个都不是问题),具有以下列(每个结构的示例):

res248: org.apache.spark.rdd.RDD[(String, Array[String])] = MapPartitionsRDD[1004] at map at <console>:246
org.apache.spark.sql.DataFrame = [id: string, list: array<string>]

我想扩展这个RDD/DF,以增加一个包含列表数组大小的列。所以输出应该是这样的(示例):

org.apache.spark.sql.DataFrame = [id: string, list: array<string>, length_of_list: int]

我试图做一个rdd.map(x=

<console>:246: error: overloaded method value count with alternatives:
  (columnName: String)org.apache.spark.sql.TypedColumn[Any,Long] <and>
  (e: org.apache.spark.sql.Column)org.apache.spark.sql.Column

尝试使用DF和函数withColumn(“new_column”,count($“list”))或其任何变体添加新列。它仍然不起作用。我收到一条关于聚合的错误消息

你知道一种不用收集RDD就能实现这一点的方法吗?


共有2个答案

陆子默
2023-03-14

您可以使用简单的自定义项创建新列,以应用于列列表,如下所示:

val df = Seq(
  ("a", Array("x1", "x2", "x3")),
  ("b", Array("y1", "y2", "y3", "y4"))
).toDF(
  "id", "list"
)
// df: org.apache.spark.sql.DataFrame = [id: string, list: array<string>]

val listSize = (l: Seq[String]) => l.size
// listSize: Seq[String] => Int = <function1>

def listSizeUDF = udf(listSize)
// listSizeUDF: org.apache.spark.sql.expressions.UserDefinedFunction

val df2 = df.withColumn("length_of_list", listSizeUDF($"list"))

df2.show
+---+----------------+--------------+
| id|            list|length_of_list|
+---+----------------+--------------+
|  a|    [x1, x2, x3]|             3|
|  b|[y1, y2, y3, y4]|             4|
+---+----------------+--------------+

[更新]

正如@Ramesh Maharjan所指出的,Spark中有一个内置的size函数,我不知怎么忘了它。我将把旧答案作为使用UDF的简单用例。

松茂实
2023-03-14

内置函数size返回数组或映射的长度。

import org.apache.spark.sql.functions._
df.withColumn("length_of_list", size($"list"))
 类似资料:
  • 问题内容: 我在Sqlite中有一个查询,其中涉及复杂的列计算,可以这样说: 我想将此计算选择为,但我还需要将其用作另一种计算的组成部分: 不幸的是,这会产生错误: 我知道我可以简单地重复计算: 但是,假设操作复杂且昂贵,是否有什么方法可以在以后重新引用它而不必重新计算呢? 问题答案: 您需要使用子查询。 结果

  • 问题内容: 我需要在SQL Server数据库中创建一列。 该列的值应基于该列的值进行计算。 同样,它的值应该随着增加而增加。 问题答案: 您应该使用计算列来解决此问题。具有类似以下内容的定义: 原始声明摘自BlackWasp并提供了更多信息。 编辑: MSDN将计算列解释为: 从可以使用同一表中其他列的表达式中计算出计算列。该表达式可以是非计算的列名,常量,函数,以及由一个或多个运算符连接的这些

  • 问题内容: 我有一个表,其中包含商店中每件商品的单价和其他详细信息。 另一个包含每个订单中包含的项目的详细信息。 现在我要计算 请注意,我希望它成为表本身的一部分,而不是作为其他视图或查询。我怎样才能做到这一点?我为此研究了触发器和其他机制,但是它们是否适用于不同表中的值,尤其是在存在此类约束的情况下? 我尝试过根据另一列计算出的Column进行以下触发吗?: 但这似乎没有用 问题答案: 这是如何

  • 我想根据列_1和列_2或列_3中的值创建一个新列“column_new”。如果列_1=='C',则列_new的值与列_2相同,但如果列_1=='G',则列_new的值与列_3相同。 我试过: 错误:值错误:序列的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all()。 还尝试: 错误:值错误:数据帧的真值不明确。使用a.empty、a.bool()、a.

  • 例1:输入:nums=[3,4,2]输出:6解释:删除4以获得4点,因此3也被删除。然后,删除2个赚取2分。共获得6分。 以下是如何解决它的解释: 算法 我无法理解这里是如何使用和变量的,以及它是如何解决问题语句的。 你能帮我理解这一点吗。

  • 在我的熊猫数据框架中,尝试创建一个名为loan\u status\u的列非常好。如果贷款状态为“当前”或“已全额支付”,则应包含整数1。否则,应包含整数0。 我使用https://resources.lendingclub.com/LoanStats_2018Q4.csv.zip作为我的数据集。 我的问题代码是: ()---- /usr/local/lib/python3.6/dist-packa