栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何将新的Struct列添加到DataFrame

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何将新的Struct列添加到DataFrame

我假设您从某种平面模式开始,如下所示:

root |-- lat: double (nullable = false) |-- long: double (nullable = false) |-- key: string (nullable = false)

首先让我们创建示例数据:

import org.apache.spark.sql.Rowimport org.apache.spark.sql.functions.{col, udf}import org.apache.spark.sql.types._val rdd = sc.parallelize(    Row(52.23, 21.01, "Warsaw") :: Row(42.30, 9.15, "Corte") :: Nil)val schema = StructType(    StructField("lat", DoubleType, false) ::    StructField("long", DoubleType, false) ::    StructField("key", StringType, false) ::Nil)val df = sqlContext.createDataframe(rdd, schema)

一种简单的方法是使用udf和case类:

case class Location(lat: Double, long: Double)val makeLocation = udf((lat: Double, long: Double) => Location(lat, long))val dfRes = df.   withColumn("location", makeLocation(col("lat"), col("long"))).   drop("lat").   drop("long")dfRes.printSchema

我们得到

root |-- key: string (nullable = false) |-- location: struct (nullable = true) |    |-- lat: double (nullable = false) |    |-- long: double (nullable = false)

一种困难的方法是转换数据并随后应用模式:

val rddRes = df.    map{case Row(lat, long, key) => Row(key, Row(lat, long))}val schemaRes = StructType(    StructField("key", StringType, false) ::    StructField("location", StructType(        StructField("lat", DoubleType, false) ::        StructField("long", DoubleType, false) :: Nil    ), true) :: Nil )sqlContext.createDataframe(rddRes, schemaRes).show

我们得到了预期的输出

+------+-------------+|   key|     location|+------+-------------+|Warsaw|[52.23,21.01]|| Corte|  [42.3,9.15]|+------+-------------+

从头开始创建嵌套模式可能很繁琐,因此,如果可以的话,我建议您采用第一种方法。如果需要更复杂的结构,可以轻松扩展它:

case class Pin(location: Location)val makePin = udf((lat: Double, long: Double) => Pin(Location(lat, long))df.    withColumn("pin", makePin(col("lat"), col("long"))).    drop("lat").    drop("long").    printSchema

我们得到预期的输出:

root |-- key: string (nullable = false) |-- pin: struct (nullable = true) |    |-- location: struct (nullable = true) |    |    |-- lat: double (nullable = false) |    |    |-- long: double (nullable = false)

不幸的是,您无法控制

nullable
字段,因此如果对您的项目很重要,则必须指定架构。

最后,您可以使用

struct
1.4中引入的功能:

import org.apache.spark.sql.functions.structdf.select($"key", struct($"lat", $"long").alias("location"))


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/399481.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号