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

Spark Scala:如何在DF中转换列

危彬彬
2023-03-14

我在Spark中有一个数据框架,其中包含许多列和我定义的udf。我想要返回相同的数据帧,除了一列被转换。此外,我的udf接收字符串并返回时间戳。有一个简单的方法可以做到这一点吗?我试过了

val test = myDF.select("my_column").rdd.map(r => getTimestamp(r)) 

但这返回一个RDD,并且只返回转换后的列。

共有1个答案

仲孙景胜
2023-03-14

如果你真的需要使用你的功能,我可以建议两个选项:

>

  • 使用map/toDF:

    import 组织.apache.spark.sql.行导入sqlContext.implicits._

    def getTimestamp:(字符串=

    val test = myDF.select(“my_column”).rdd.map { case Row(string_val: String) =

    使用自定义函数UserDefinedFunction):

    进口org.apache.spark.sql.functions._

    def getTimestamp:(字符串=

    val newCol=udf(getTimestamp). application("my_column")) // 创建新列val test=myDF.withColumn("new_column", newCol)//将新列添加到原始DF

    或者,

    如果只想将字符串类型列转换为时间戳类型列,则可以使用 Spark SQL 1.5 中提供的unix_timestamp列函数:

    val test = myDF
      .withColumn("new_column", unix_timestamp(col("my_column"), "yyyy-MM-dd HH:mm").cast("timestamp"))
    

    注意:对于Spark 1.5. x,在转换为时间戳之前,需要将unix_timestamp的结果乘以1000(问题SPARK-11724)。生成的代码将是:

    val test = myDF
      .withColumn("new_column", (unix_timestamp(col("my_column"), "yyyy-MM-dd HH:mm") *1000L).cast("timestamp"))
    

    编辑:添加自定义项选项

  •  类似资料:
    • 我有一个excel文件,看起来像这样: Header3包含如下所示的JSON字符串 我想解析JSON Header3列,并为每个键创建一个列,其中键的名称附加有键2的值,整个文件中的键始终相同。 结束数据帧应如下所示: 实例: 需要成为: 在进入花哨的东西之前,我试图至少规范化数据,但我得到了一个空序列。

    • 问题内容: 我是Java的新手,想知道double转换为int cast如何工作吗?我知道,只需将低32位转换为int就很容易了,但是将double(64位)转换为int(32位)呢?来自二进制的double中的那64位是Double- precision浮点格式(Mantissa),那么它如何在内部转换为int? 问题答案: 所有这些都记录在JLS的5.1.3节中。 第一步,将浮点数转换为lon

    • 我正试图从JSONB转换为Google GSON JSONElement。我使用的转换器来自:https://www.jooq.org/doc/3.11/manual/code-generation/custom-data-type-bindings/ TableImpl中的列:

    • 我有一个Map,其中键是字符串,值是逗号分隔的值列表。 我如何才能逆转键/值对的顺序,并分配给新Map,使键成为值,值成为键 所以: 变成: 一种可能的解决方案是迭代每个值,然后迭代每个键,搜索相同的对应值。如果找到,将这个新的键/值对添加到一个新映射中。这似乎效率低下? 解决方案(使用公认的答案实施):

    • 本文向大家介绍在JavaScript中NaN如何转换为String?,包括了在JavaScript中NaN如何转换为String?的使用技巧和注意事项,需要的朋友参考一下 您可以尝试运行以下命令以了解如何在JavaScript中将NaN转换为String- 示例

    • 问题内容: 我要转换: 变成“ 5小时前” 如何用Java做到这一点? 问题答案: JodaTime支持从用户定义的格式进行解析。请参见DateTimeFormatterBuilder和DateTimeBuilder.parseDateTime()。 一旦有了DateTime,就可以从该时间和当前时间创建一个Duration或Period,并使用另一个格式化程序进行漂亮的打印。[请参阅上面的注释中