Spark创建多种数据格式的DataFrame

假如我们要通过RDD[Row]创建一个包含多个列的DataFrame,重点是列的数据类型可能会包含多个,这时候需要有一点技巧。

| uid | user_name | age | income |

|:----|:----------|:----|:-------|

| 1111 | nituchao | 21 | 123.0 |

这个`DataFrame`里包含多个数据类型:

* uid: Long

* user_name: String

* age: Int

* income: Double

我们可以使用下面的方式来构建:

```scala

import org.apache.spark.sql.Row

import org.apache.spark.sql.types.{DoubleType, IntegerType, LongType, StringType, StructField, StructType}

val uidSeq = Seq(1111L)

val nameSeq = Seq("nituchao")

val ageSeq = Seq(21)

val incomeSeq = Seq(123.0)

val rowRDD = spark.sparkContext.parallelize(Seq(Row.fromSeq(uidSeq ++ userNameSeq ++ ageSeq ++ incomeSeq)))

val schema = StructType(Seq(StructField("uid", LongType, nullable = true),

StructField("name", StringType, nullable = true),

StructField("age", IntegerType, nullable = true),

StructField("sex", DoubleType, nullable = true)))

val df = spark.sqlContext.createDataFrame(rowRDD, schema)

df.printSchema()

df.show()

```

输出:

```shell

root

|-- uid: long (nullable = true)

|-- name: string (nullable = true)

|-- age: integer (nullable = true)

|-- sex: double (nullable = true)

+----+---------+---+-----+

| uid|name |age| sex|

+----+---------+---+-----+

|1111| nituchao| 21|123.0|

+----+---------+---+-----+

```

上面的技巧在于,使用`Row.fromSeq()`时,不同类型的数据,要用`Seq()`分别包起来然后`++`拼接后传进去。因为Seq中的元素必须是同类型的,如直接构造成一个Seq则会自动进行类型转换,多种类型数据不能混用。

问题不大,却造成很大困扰。

相关推荐
AI猫站长2 分钟前
工信部发布具身智能首份强制标准:静态定位误差≤0.1°、动态响应≤50ms、多模态任务成功率≥85%
大数据·人工智能·机器学习·具身智能·灵心巧手
@高蕊1 小时前
首创光储协同算法!iSolarBP破解分布式光伏市场化评估难题
大数据·人工智能·算法·arcgis·无人机
清平乐的技术专栏1 小时前
查看impala版本
大数据
土土哥V_araolin1 小时前
一生手护分销模式系统开发概述
大数据·小程序·零售
AI先驱体验官1 小时前
数字人时代来临:实时互动数字人解决方案深度解析
大数据·网络·人工智能·深度学习·机器学习·重构·实时互动
m0_752035631 小时前
ROW_NUMBER() OVER() 窗口函数详解
大数据·数据库
土土哥V_araolin1 小时前
2+1链动退休模式系统(升级版)解析
大数据·小程序·零售
Eternity_GQM2 小时前
【Git入门】
大数据·git·elasticsearch
ManageEngineITSM2 小时前
功能越来越强,但 IT 使用体验却越来越差
大数据·excel·资产管理·itsm·工单系统
YA8888888888892 小时前
数字时代B端拓客:号码核验的价值重构与行业突围,氪迹科技法人股东号码筛选系统,阶梯式
大数据·人工智能·重构