我正在尝试将以下文件读入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?
答案 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