scala - Spark RDD 到数据框
问题描述
以下是文件中的数据
PREFIX|Description|Destination|Num_Type
1|C1|IDD|NA
7|C2|IDDD|NA
20|C3|IDDD|NA
27|C3|IDDD|NA
30|C5|IDDD|NA
我正在尝试阅读并转换为 Dataframe。
val file=sc.textFile("/user/cloudera-scm/file.csv")
val list=file.collect.toList
list.toDF.show
+--------------------+
| value|
+--------------------+
|PREFIX|Descriptio...|
| 1|C1|IDD|NA|
| 7|C2|IDDD|NA|
| 20|C3|IDDD|NA|
| 27|C3|IDDD|NA|
| 30|C5|IDDD|NA|
+--------------------+
我无法将其转换为具有精确表格形式的数据帧
解决方案
让我们首先考虑您的代码。
// reading a potentially big file
val file=sc.textFile("/user/cloudera-scm/file.csv")
// collecting everything to the driver
val list=file.collect.toList
// converting a local list to a dataframe (this does not work)
list.toDF.show
有一些方法可以让你的代码工作,但逻辑很尴尬。您正在使用执行程序读取数据,将所有数据放在驱动程序上,以便将其简单地转换为数据帧(返回给执行程序)。这是大量的网络通信,对于任何相当大的数据集,驱动程序很可能会耗尽内存。
你可以做什么直接读取数据作为这样的数据帧(驱动程序什么也不做,也没有不必要的 IO):
spark.read
.option("sep", "|") // specify the delimiter
.option("header", true) // to tell spark that there is a header
.option("inferSchema", true) // optional, infer the types of the columns
.csv(".../data.csv").show
+------+-----------+-----------+--------+
|PREFIX|Description|Destination|Num_Type|
+------+-----------+-----------+--------+
| 1| C1| IDD| NA|
| 7| C2| IDDD| NA|
| 20| C3| IDDD| NA|
| 27| C3| IDDD| NA|
| 30| C5| IDDD| NA|
+------+-----------+-----------+--------+
推荐阅读
- java - 使用队列实现对对象的 ArrayList 实现快速排序
- reactjs - 努力从 Redux Store 获取数组数据
- javascript - 带有反应状态的数学运算
- reactjs - 在类组件中使用 react-bootstrap/Offcanvas
- swift - 表格视图没有重新利用单元格
- hyperlink - 如何在詹金斯的控制台输出中编写.html链接
- identityserver4 - 在 IdentityServer4 中支持核心身份角色
- excel - 如何使用 excel odbc 驱动程序获取仅数字值?
- javascript - 地图功能中箭头功能中的“咖啡”来自哪里?
- architecture - 高可用但一致的 id 生成器