为数据框架创建架构的有效方法是什么?

时间:2017-06-22 07:04:13

标签: apache-spark

我是新手,我发现有两种方法可以创建数据框的架构。 我有一个RDD:empRDD与数据(由",&#34分开)

+---+-------+------+-----+
|  1|   Mark|  1000|   HR|
|  2|  Peter|  1200|SALES|
|  3|  Henry|  1500|   HR|
|  4|   Adam|  2000|   IT|
|  5|  Steve|  2500|   IT|
|  6|  Brian|  2700|   IT|
|  7|Michael|  3000|   HR|
|  8|  Steve| 10000|SALES|
|  9|  Peter|  7000|   HR|
| 10|    Dan|  6000|   BS|
+---+-------+------+-----+

val empFile = sc.textFile("emp")
val empData = empFile.map(e => e.split(","))

创建模式的第一种方法是使用案例类:

case class employee(id:Int, name:String, salary:Int, dept:String)
val empRDD = empData.map(e => employee(e(0).toInt, e(1), e(2).toInt, e(3)))
val empDF = empRDD.toDF()

第二种方法是使用StructType:

    val empSchema = StructType(Array(StructField("id", IntegerType, true),
                    StructField("name", StringType, true), 
                    StructField("salary", IntegerType, true), 
                    StructField("dept", StringType, true)))
    val empRDD = empdata.map(e => Row(e(0).toInt, e(1), e(2).toInt, e(3)))
    val empDF  = sqlContext.createDataFrame(empRDD, empSchema)

我个人更喜欢使用StructType进行编码。但我不知道在实际的行业项目中推荐哪种方式。谁能让我知道首选方式?

3 个答案:

答案 0 :(得分:2)

您可以使用spark-csv库来阅读csv个文件,根据我们的要求,此库有很多options

您可以将csv文件读为

val df = sqlContext.read
    .format("com.databricks.spark.csv")
    .option("header", "true") // Use first line of all files as header
    .option("inferSchema", "true") // Automatically infer data types
    .load("data.csv")

但是,您也可以手动提供架构。

我认为最好的方法是将csvspark-csv一起作为dataset阅读

val cities = spark.read
  .option("header", "true")
  .csv(location)
  .as[employee]

通过rdd和dataframe here了解数据集的优势。

如果您已经拥有该模式,也可以从案例类生成模式。

import org.apache.spark.sql.Encoders
val empSchema = Encoders.product[Employee].schema

希望这有帮助

答案 1 :(得分:1)

如果您从CSV文件(或任何分隔文件)创建RDD,您可以自动推断架构,如@Shankar Koirala所述。

如果您是从其他来源创建RDD,那么:

一个。当您拥有较少数量的字段(少于22个)时,可以使用案例类创建它。

B中。如果您有超过22个字段,则需要以编程方式创建模式

Link to Spark Programming Guide

答案 2 :(得分:0)

如果输入文件是分隔文件,则可以使用databrick的spark-csv库。

使用这种方式:

ng generate module [name]

对于spark 2.0;

// For spark < 2.0
DataFrame df = sqlContext.read()
            .format("com.databricks.spark.csv")
            .option("header", "true")
            .option("nullValue", "")
            .load("./data.csv");
df.show();

在命令中使用DataFrame df = sqlContext.read() .format("csv") .option("header", "true") .option("nullValue", "") .load("./data.csv"); df.show(); 可以进行大量自定义。 如:

  1. option自动推断每列的数据类型。
  2. .option("inferSchema", "true")定义压缩编解码器
  3. .option("codec", "org.apache.hadoop.io.compress.GzipCodec")将分隔符指定为.option("delimiter", ",")
  4. Databrick的spark-csv库被移植到spark 2.0。

    使用此库可以免除解析分隔文件的各种用例的困难。

    参考:','