【问题标题】:Unable to create dataframe using SQLContext object in spark2.2无法在 spark2.2 中使用 SQLContext 对象创建数据框
【发布时间】:2018-06-06 13:44:10
【问题描述】:

我在 Microsoft Windows 7 上使用spark 2.2 version。我想将 csv 文件加载到一个变量中,以便稍后执行 SQL 相关操作,但无法执行此操作。我从this 链接中提到了接受的答案,但没有用。我按照以下步骤创建SparkContext 对象和SQLContext 对象:

import org.apache.spark.SparkContext  
import org.apache.spark.SparkConf  
val sc=SparkContext.getOrCreate() // Creating spark context object 
val sqlContext = new org.apache.spark.sql.SQLContext(sc) // Creating SQL object for query related tasks  

对象已成功创建,但是当我执行下面的代码时,它会引发无法在此处发布的错误。

val df = sqlContext.read.format("csv").option("header", "true").load("D://ResourceData.csv")  

当我尝试像df.show(2) 这样的东西时,它说 df 没有找到。我尝试了从附加链接加载 CSV 的 databricks 解决方案。它下载包但不加载 csv 文件。那么我该如何纠正我的问题呢?在此先感谢:)

【问题讨论】:

  • spark 2.x 有 SparkSession 作为入口点..
  • 先生,我可以创建对象。我试过玩 sc 对象,它工作得很好
  • 正如@undefined_variable 建议的那样,您可以使用SparkSession 来执行这些操作。如果您正在运行spark-shell,您将在spark 变量中获得SparkSession
  • 我已经尝试过了:import org.apache.spark.sql.SparkSession val spark = SparkSession.builder。 master("local") .appName("spark session 示例") .getOrCreate() @VipingGS
  • 你在使用 spark-shell 吗?

标签: scala csv apache-spark apache-spark-sql


【解决方案1】:

借助以下代码,我解决了使用1.6 version 中的1.6 version 在数据框中加载本地文件的问题:

1) sudo spark-shell --jars /usr/lib/spark/lib/spark-csv_2.10-1.5.0.jar,/usr/lib/spark/lib/commons-csv-1.5.jar,/usr/lib/spark/lib/univocity-parsers-1.5.1.jar  

2) val df1 = sqlContext.read.format("com.databricks.spark.csv").option("header", "true").option("treatEmptyValuesAsNulls", "true" ).option("parserLib", "univocity").load("file:///home/cloudera/Desktop/ResourceData.csv")

注意scsqlContext 变量是自动创建的 但是最新版本有很多改进,即 2.2.1,我无法使用这些改进,因为 metastore_db 没有在 Windows 7 中创建。我将发布一个关于相同的新问题。

【讨论】:

    【解决方案2】:

    参考您的评论,您可以访问 SparkSession 变量,然后按照以下步骤使用 SparkSQL 处理您的 csv 文件。

    Spark SQL 是用于结构化数据处理的 Spark 模块。


    主要有两个抽象——Dataset和Dataframe

    数据集是数据的分布式集合。

    DataFrame 是组织成命名列的数据集。 在 Scala API 中,DataFrame 只是 Dataset[Row] 的类型别名。


    使用 SparkSession,应用程序可以从现有 RDD、Hive 表或 Spark 数据源创建 DataFrame。


    您有一个 csv 文件,您可以通过执行以下操作之一简单地创建一个数据框:


    • 从您的spark-shell 使用SparkSession 变量spark

      val df = spark.read .format("csv") .option("header", "true") .load("sample.csv")


    • 将文件读入dataframe后,即可注册到临时视图中。

      df.createOrReplaceTempView("foo")


    • 可以使用Spark提供的sql方法运行SQL语句

      val fooDF = spark.sql("SELECT name, age FROM foo WHERE age BETWEEN 13 AND 19")


    • 您也可以直接使用 SQL 查询该文件:

      val df = spark.sql("SELECT * FROM csv.'file:///path to the file/'")


    • 确保在从本地加载数据时以本地模式运行 spark,否则会出错。当您已经设置了HADOOP_CONF_DIR 环境变量并且需要"hdfs://..." 否则"file://" 时会发生错误。
    • 设置您的 spark.sql.warehouse.dir(默认:${system:user.dir}/spark-warehouse)。

      .config("spark.sql.warehouse.dir", "file:///C:/path/to/my/")

    它是Hive仓库目录的默认位置(使用Derby) 托管数据库和表。设置好仓库目录后,Spark 将能够定位您的文件,并且您可以加载 csv。

    参考:Spark SQL Programming Guide

    【讨论】:

    • 我试过这一行:val df = spark.read.format("csv").option("header", "true").load("D://ResourceData.csv")它抛出了一些很长的错误,当我执行 df.show() 时,它给出了 df is not found
    • 我想从本地机器而不是从 hdfs 加载数据。你能检查一下你的工作路径吗
    • 更新了所需的路径信息。
    • 我正在尝试,有没有最好的工具可以让我使用 spark 而不是在 cmd 中播放它
    • 一个 Google 离开:here。请考虑对相关的具体问题发表评论。
    【解决方案3】:

    Spark 2.2.0 版内置了对 csv 的支持。

    在您的 spark-shell 中运行以下代码

    val df= spark.read
                 .option("header","true")
                 .csv("D:/abc.csv")
    
    df: org.apache.spark.sql.DataFrame = [Team_Id: string, Team_Name: string ... 1 more field]
    

    【讨论】:

    • 好的,我试试这个,然后告诉你
    • 我收到此错误 17/12/27 10:36:38 WARN ObjectStore:无法获取数据库默认值,返回 NoSuchObjectException java.lang.IllegalArgumentException:实例化 'org.apache.spark.sql 时出错.hive.HiveSessionStateBuilder':在 org.apache.spark.sql.SparkSession$.org$apache$spark$sql$SparkSession$$instantiateSessionState(SparkSession.scala:1062)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    • 2022-08-24
    • 1970-01-01
    • 2019-02-10
    • 1970-01-01
    相关资源
    最近更新 更多