我是新手,我发现有两种方法可以创建数据框的架构。 我有一个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进行编码。但我不知道在实际的行业项目中推荐哪种方式。谁能让我知道首选方式?
答案 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")
但是,您也可以手动提供架构。
我认为最好的方法是将csv
与spark-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个字段,则需要以编程方式创建模式
答案 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();
可以进行大量自定义。
如:
option
自动推断每列的数据类型。.option("inferSchema", "true")
定义压缩编解码器.option("codec", "org.apache.hadoop.io.compress.GzipCodec")
将分隔符指定为.option("delimiter", ",")
Databrick的spark-csv库被移植到spark 2.0。
使用此库可以免除解析分隔文件的各种用例的困难。
参考:','