Spark DataFrame基础

Spark创建DataFrame的不同方式

本文介绍了使用Scala示例在Spark中创建DataFrame(createDataFrame)的不同方法。

首先,让我们导入Spark需要的隐式函数,如.toDF()函数,并为示例创建数据。

import spark.implicits._
val columns = Seq("language", "users_count")
val data = Seq(("Java", "20000"), ("Python", "10000"), ("Scala", "30000"))

1. Create Spark DataFrame from RDD

首先,调用SparkContext中的parallelize()函数从集合Seq创建RDD。对于下面的所有示例,都需要这个rdd对象。

val rdd = spark.SparkContext.parallelize(data)

1. a) 使用toDF()函数

一旦创建了一个RDD,可以使用toDF()来创建一个DataFrame。默认情况下,假如数据集每一行有两列,创建的DF时候的列名就是"_1"和"_2"。

val dfFromRDD1 = rdd.toDF()
dfFromRDD1.printSchema()

root
|-- _1: string (nullable = true)
|-- _2: string (nullable = true)

toDF()具有另一个签名,该签名自定义列名称参数,如下所示:

val dfFromRDD1 = rdd.toDF("language", "users_count")
dfFromRDD1.printSchema()

root
|-- language: string (nullable = true)
|-- users: string (nullable = true)

默认情况下,这些列的数据类型是通过推断列的数据类型来判断的。我们可以通过提供模式来更改此行为,我们可以在其中为每个字段/列指定列名,数据类型和可为空。

1.b) 使用SparkSession的creatDataFrame()函数

使用SparkSession中的createDataFrame()是另一种创建方法,它以rdd对象作为参数。使用toDF()来指定列的名称。

dfFromRDD2 = spark.createDataFrame(rdd).toDF(columns:_*)

1.c)对行类型使用createDataFrame()

createDataFrame()有另一个签名,它将列名的RDD[Row]类型和模式作为参数。首先,我们需要将rdd对象从RDD[T]转换为RDD[Row]类型。

val schema = StructType(columns.map(fieldName => StructField(fieldName, StringType, nullable = true)))
val rowRDD = rdd.map(attributes => Row(attributes._1, attributs._2))
val dfFromRDD3 = spark.createDataFrame(rowRdd.schema)

2. 从List和Seq集合中创建Spark DataFrame

在本节中,我们将看到从集合Seq[T]或List[T]创建Spark DataFrame的几种方法。这些示例与我们上面的RDD部分看到的类型,但是我们使用的是数据对象而不是RDD对象。

2.a) List或者Seq使用toDF()

val dfFromData1 = data.toDF()

2.b) 使用SparkSession的createDataFrame()方法

var dfFromData2 = spark.createDataFrame(data).toDF(columns:_*)

2.c) 使用Row type的createDataFrame()方法

import scala.collection.JavaConversions._
val rowData = data.map(attributes => Row(attributes._1, attributes._2))
var dfFromData3 = spark.createDataFrame(rowData, schema)

3. 从CSV文件创建Spark DataFrame

val df2 = spark.read.csv("/src/resources/file.csv")

4. 从text文件创建

val df2 = spark.read.text("/src/resources/file.txt")

5. 从JSON文件创建

val df2 = spark.read.json("/src/resources/file.json")

6. 从XML文件创建

从xml解析DataFrame,我们应该使用数据源:com.databricks.spark.xml

<dependency>
     <groupId>com.databricks</groupId>
     <artifactId>spark-xml_2.11</artifactId>
     <version>0.6.0</version>
 </dependency>
val df = spark.read.format("com.databricks.spark.xml")
        .option("rowTag", "person")
        .xml("src/main/resources/persons.xml")

7. 从Hive创建

val hiveContext = new org.apache.spark.sql.hive.HiveContext(spark.sparkContext)
val hiveDF = hiveContext.sql("select * from emp")

8. 从RDBMS创建

8.a) Mysql table

确保在pom.xml文件或类路径中的MySQL jars中都具有Mysql库作为依赖项

val df_mysql = spark.read.format("jdbc")
    .option("url", "jdbc:mysql://localhost:port/db")
    .option("driver", "com.mysql.jdbc.Driver")
    .option("dbtable", "tablename")
    .option("user", "user")
    .option("password", "password")
    .load()

8.b) DB2

确保在pom.xml文件或类路径中的DB2 jar中将DB2库作为依赖项。

val df_db2 = spark.read.format(“jdbc”)
   .option(“url”, “jdbc:db2://localhost:50000/dbname”)
   .option(“driver”, “com.ibm.db2.jcc.DB2Driver”)
   .option(“dbtable”, “tablename”) 
   .option(“user”, “user”) 
   .option(“password”, “password”) 
   .load()

9. 从HBase创建DataFrame

要从HBase表创建Spark DataFrame,我们应该使用Spark HBase连接器中定义的数据源。

 val hbaseDF = sparkSession.read
      .options(Map(HBaseTableCatalog.tableCatalog -> catalog))
      .format("org.apache.spark.sql.execution.datasources.hbase")
      .load()
posted @ 2020-03-14 21:48  DCREN  阅读(5913)  评论(1编辑  收藏  举报