我有一个要求,我需要阅读excel文件(扩展名为.xlsx)。我需要创建一个数据框,其中包含从excel读取的数据,并在其上应用/编写sql查询以进行一些分析。excel文件有一些列标题/标题,如“time_spend_company(年)"“、average_monthly_hours(小时)”等,作为标题本身中的空格,这些空格导致我在加载的 Dataframe 上应用任何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
我需要帮助:-
1.有没有更好的方法来加载excel并为它分配自定义列名,然后创建一个数据框?
1.如何编写sql查询这些列名中有空格?
注:我需要阅读它作为excel文件只,我不能转换成csv或任何其他文件格式。
4条答案
按热度按时间3npbholx1#
对于
0.13.5
版本,您将需要一组不同的参数:Maven依赖性:
mwecs4sa2#
回答您的问题2:尽管使用
'
,您需要在列名的开头和结尾使用',并使用空格。尝试下面的查询,它将工作:问题1:使用“com.crealytics.spark.excel”加载excel是可以的。我也在使用它。也可以有不同的选项。要分配不同的列名,您可以使用Struct Type来定义模式,并在将数据加载到dataframe时施加它。例如
前四个列名现在将由a、b、c和d访问。在下面运行查询,它将处理新列名。
vwhgwdsa3#
EmpDatasets.xlsx
重命名为EmpDatasets.csv
来将它转换成CSV,使用this就可以了。一旦你有了CSV格式的文件,你就可以读取它为
spark.read.csv(pathToCSV)
,并可以提供许多选项,如:读取/跳过标题或提供数据集架构为spark.read.schema(schema).csv(pathToCSV)
。这里,
schema
可以按照here所述创建,也可以使用spark sql EncodersEncoders.product[case_class_name].schema
从案例类中提取1.可以从列名中删除空格,例如:
val employeesDFColumns = employeesDF.columns.map(x => col(x.replaceAll(" ", "")))
并在 Dataframe 上应用这些新列名。
val employeeDF = employeeDF.select(employeesDFColumns:_*)
rdlzhqv94#
我们可以使用panda库将PySpark数据保存到Excel文件中,该库提供了以Excel格式写入数据的功能。