编程语言
首页 > 编程语言> > java-如何在不知道数据模式的情况下从文本文件将数据加载到spark数据帧中?

java-如何在不知道数据模式的情况下从文本文件将数据加载到spark数据帧中?

作者:互联网

我在hadoop中有一个文本文件,我需要使用spark java api在第二列中对其进行排序.我正在使用数据框,但不确定其列.
它可能具有动态列,这意味着我不知道确切的列数.

我该如何进行?请帮我.

提前致谢.

解决方法:

第一件事是我想在Scala中提供一个csv示例(不是Java)

您可以使用Spark csv api创建数据框并根据所需的任何列进行排序.
如果您有任何限制,请参见以下方式.

固定列数:

从下面的固定列数示例开始.
 您可以按照此示例.

数据看起来像ebay.csv的地方:

“8213034705,95,2.927373,jake7870,0,95,117.5,xbox,3”

//  SQLContext entry point for working with structured data
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
// this is used to implicitly convert an RDD to a DataFrame.
import sqlContext.implicits._
// Import Spark SQL data types and Row.
import org.apache.spark.sql._

//define the schema using a case class
case class Auction(auctionid: String, bid: Float, bidtime: Float, bidder: String, bidderrate: Integer, openbid: Float, price: Float, item: String, daystolive: Integer)


 val auction = sc.textFile("ebay.csv").map(_.split(",")).map(p => 
Auction(p(0),p(1).toFloat,p(2).toFloat,p(3),p(4).toInt,p(5).toFloat,p(6).toFloat,p(7),p(8).toInt )).toDF()

// Display the top 20 rows of DataFrame 
auction.show()
// auctionid  bid   bidtime  bidder         bidderrate openbid price item daystolive
// 8213034705 95.0  2.927373 jake7870       0          95.0    117.5 xbox 3
// 8213034705 115.0 2.943484 davidbresler2  1          95.0    117.5 xbox 3 …


// Return the schema of this DataFrame
auction.printSchema()
root
 |-- auctionid: string (nullable = true)
 |-- bid: float (nullable = false)
 |-- bidtime: float (nullable = false)
 |-- bidder: string (nullable = true)
 |-- bidderrate: integer (nullable = true)
 |-- openbid: float (nullable = false)
 |-- price: float (nullable = false)
 |-- item: string (nullable = true)
 |-- daystolive: integer (nullable = true)

auction.sort("auctionid") // this will sort first column i.e auctionid

可变的列数(since Case class with Array parameter is possible):

您可以像下面的伪代码一样使用,其中前4个元素是固定的,其余所有元素都是可变数组…

由于您只是为了在第二列上进行排序而插入,因此可以解决该问题,并且所有其他数据都将在该特定行的数组中存在,以备后用.

case class Auction(auctionid: String, bid: Float, bidtime: Float, bidder: String, variablenumberofColumnsArray:String*)

 val auction = sc.textFile("ebay.csv").map(_.split(",")).map(p => 
Auction(p(0),p(1).toFloat,p(2).toFloat,p(3),p(4).toInt, VariableNumberOfColumnsArray or any complex type like Map ).toDF()

    auction.sort("auctionid") // this will sort first column i.e auctionid

标签:apache-spark,apache-spark-sql,java
来源: https://codeday.me/bug/20191026/1937142.html