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则会自动进行类型转换,多种类型数据不能混用。

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

相关推荐
一瓣橙子1 小时前
缺少关键的 MapReduce 框架文件
大数据·mapreduce
永洪科技8 小时前
永洪科技荣获商业智能品牌影响力奖,全力打造”AI+决策”引擎
大数据·人工智能·科技·数据分析·数据可视化·bi
weixin_307779138 小时前
Hive集群之间迁移的Linux Shell脚本
大数据·linux·hive·bash·迁移学习
ZHOU_WUYI9 小时前
一个简单的分布式追踪系统
分布式
上海锝秉工控11 小时前
防爆拉线位移传感器:工业安全的“隐形守护者”
大数据·人工智能·安全
cv高级工程师YKY12 小时前
SRE - - PV、UV、VV、IP详解及区别
大数据·服务器·uv
bxlj_jcj13 小时前
深入Flink核心概念:解锁大数据流处理的奥秘
大数据·flink
云资源服务商13 小时前
阿里云Flink:开启大数据实时处理新时代
大数据·阿里云·云计算
码不停蹄的玄黓13 小时前
MySQL分布式ID冲突详解:场景、原因与解决方案
数据库·分布式·mysql·id冲突
Aurora_NeAr14 小时前
Spark SQL架构及高级用法
大数据·后端·spark