使用混合csv数据源创建Spark DataFrame

时间:2017-06-27 20:46:01

标签: scala apache-spark dataframe

我正在尝试将以下文件读入Spark Scala DataFrame

 2:
 2059652,4,2005-09-05
 1666394,3,2005-04-19
 1759415,4,2005-04-22
 ...

第一个元素是一个项目,以下行是:users,rating,timestamp

我希望最终得到一个具有以下架构的DataFrame / DataSet:

case class Rating(user: Integer, item: Integer, rating: Integer, timestamp: Timestamp)

我可以使用以下内容读取数据:

val csv = sc.textFile("/FileStore/tables/qxlh0gub1498510564366/mv_0000001.txt") 
val data = csv.map(line => line.split(":").map(elem => elem.trim)).toDF() 

+--------------------+
|               value|
+--------------------+
|                 [1]|
|[1488844,3,2005-0...|
|[822109,5,2005-05...|

但我不清楚如何使用上述架构将其转换为Ratings DataFrame?

1 个答案:

答案 0 :(得分:2)

您可以使用wholeTextFiles的{​​{1}} api 来读取一行中的数据,然后格式化该行以满足您的需要。以下代码将为您提供获得所需输出的想法。

我假设你有一个数据为

的文本文件
sparkContext

工作代码是

2:
2059652,4,2005-09-05
1666394,3,2005-04-19
1759415,4,2005-04-22
1:
2059652,4,2005-09-05
1666394,3,2005-04-19
1759415,4,2005-04-22

您应该输出

val csv = sc.wholeTextFiles("/FileStore/tables/qxlh0gub1498510564366/mv_0000001.txt")
var item = ""
val df = csv.flatMap(tuple => tuple._2.replace(":\n", "###").split("\n")).map(line =>{
  if(line.contains("###")) {
    item = line.substring(0, line.indexOf("###"))+"###"
    line
  }
  else{
    item+line
  }
}).map(line => {
  val array = line.split("###")
  val subArray = array(1).split(",")
  Rating(subArray(0).toInt, array(0).toInt, subArray(1).toInt, subArray(2))
}).toDF

df.show(false)

我将+-------+----+------+----------+ |user |item|rating|timestamp | +-------+----+------+----------+ |2059652|2 |4 |2005-09-05| |1666394|2 |3 |2005-04-19| |1759415|2 |4 |2005-04-22| |2059652|1 |4 |2005-09-05| |1666394|1 |3 |2005-04-19| |1759415|1 |4 |2005-04-22| +-------+----+------+----------+ 时间戳一起用作case class

String