spark/scala中如何将excel数据读入数据框

yjghlzjz  于 2023-02-12  发布在  Scala
关注(0)|答案(4)|浏览(327)

我有一个要求,我需要阅读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或任何其他文件格式。

3npbholx

3npbholx1#

对于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>
mwecs4sa

mwecs4sa2#

回答您的问题2:尽管使用',您需要在列名的开头和结尾使用',并使用空格。尝试下面的查询,它将工作:

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)`")

问题1:使用“com.crealytics.spark.excel”加载excel是可以的。我也在使用它。也可以有不同的选项。要分配不同的列名,您可以使用Struct Type来定义模式,并在将数据加载到dataframe时施加它。例如

val newSchema = StructType(
    List(StructField("a", IntegerType, nullable = true),
         StructField("b", IntegerType, nullable = true),
         StructField("c", IntegerType, nullable = true),
         StructField("d", IntegerType, nullable = true))
  )

val employeesDF = spark.read.schema(newSchema)
  .format("com.crealytics.spark.excel")
  .option("sheetName", "Sheet1")
  .option("useHeader", "true")
  .option("treatEmptyValuesAsNulls", "false")
  .option("inferSchema", "false")
  .option("location", empFile)
  .option("addColorColumns", "False")
  .load()

前四个列名现在将由a、b、c和d访问。在下面运行查询,它将处理新列名。

sc.sqlContext.sql("select a,b,c,d from EMP").show()
vwhgwdsa

vwhgwdsa3#

  1. Spark对CSV有很好的支持,所以如果你的excel文件只有一个工作表,你可以通过简单地将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:_*)
rdlzhqv9

rdlzhqv94#

我们可以使用panda库将PySpark数据保存到Excel文件中,该库提供了以Excel格式写入数据的功能。

from pyspark.sql import SparkSession
import pandas as pd

# Create a Spark session
spark = SparkSession.builder.appName("PySpark to Excel").getOrCreate()

# Create a PySpark dataframe
df = spark.createDataFrame([(1, "John Doe", 30), (2, "Jane Doe", 35), (3, "Jim Brown", 40)], 
                           ["id", "name", "age"])

# Convert the PySpark dataframe to a pandas dataframe
pandas_df = df.toPandas()

# Write the pandas dataframe to an Excel file
pandas_df.to_excel("output.xlsx", index=False)

# Stop the Spark session
spark.stop()

相关问题