我有一个要求,我需要读取 Spark/scala 中的 excel 文件(扩展名为 .xlsx)。我需要创建一个数据框,其中包含从 Excel 读取的数据,并在其上应用/写入 SQL 查询以进行一些分析。 Excel 文件有一些列标题/标题,如“time_spend_company(年)”、“average_monthly_hours(小时)”等,作为标题本身的空格,这些空格导致我在加载的数据帧上应用任何 SQL 查询时遇到问题。
我正在使用com.crealytics.spark.excel库来解析Excel内容,我的代码如下所示
val empFile = "C:\\EmpDatasets.xlsx"
val employeesDF = sc.sqlContext.read
.format("com.crealytics.spark.excel")
.option("sheetName", "Sheet1")
.option("useHeader", "true")
.option("treatEmptyValuesAsNulls", "false")
.option("inferSchema", "false")
.option("location", empFile)
.option("addColorColumns", "False")
.load()
employeesDF.createOrReplaceTempView("EMP")
我想在这些列上应用一些 group by 和其他聚合函数,我遇到了如下这些列的问题,我的要求是在 time_spent_company 列上应用 group by 并获取计数它。
val expLevel = sc.sqlContext.sql("Select 'time_spend_company (Years)' as 'Years_spent_in_company',count(1) from EMP where left_company = 1 group by 'time_spend_company (Years)'")
expLevel.show
我需要以下方面的帮助:-
- 有没有更好的方法来加载 Excel 并为其分配自定义列名称并创建数据框?
- 如何为这些包含空格的列名编写sql查询?
注意:我只需将其作为 Excel 文件读取,无法转换为 csv 或任何其他文件格式。
最佳答案
对于版本0.13.5
,您将需要一组不同的参数:
def readExcel(file: String): DataFrame = {
sqlContext.read
.format("com.crealytics.spark.excel")
.option("dataAddress", "'sheet_name'!A1") // Optional, default: "A1"
.option("header", "true") // Required
.option("treatEmptyValuesAsNulls", "false") // Optional, default: true
.option("inferSchema", "true") // Optional, default: false
.option("addColorColumns", "false") // Optional, default: false
.option("timestampFormat", "MM-dd-yyyy HH:mm:ss") // Optional, default: yyyy-mm-dd hh:mm:ss[.fffffffff]
.option("maxRowsInMemory", 20) // Optional, d[#All]efault None. If set, uses a streaming reader which can help with big files
.load(file)
}
maven 依赖:
<dependency>
<groupId>com.crealytics</groupId>
<artifactId>spark-excel_2.11</artifactId>
<version>0.13.5</version>
</dependency>
关于scala - 如何在spark/scala中将excel数据读入数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47442333/