使用 spark-csv 在 zeppelin 中读取 csv 文件

Posted

技术标签:

【中文标题】使用 spark-csv 在 zeppelin 中读取 csv 文件【英文标题】:Reading csv files in zeppelin using spark-csv 【发布时间】:2016-01-03 04:39:56 【问题描述】:

我想在 Zeppelin 中读取 csv 文件并想使用 databricks' spark-csv 包:https://github.com/databricks/spark-csv

在 spark-shell 中,我可以使用 spark-csv 和

spark-shell --packages com.databricks:spark-csv_2.11:1.2.0

但是我如何告诉 Zeppelin 使用那个包呢?

提前致谢!

【问题讨论】:

zeppelin.incubator.apache.org/docs/interpreter/… 好的,添加:%dep --packages com.databricks:spark-csv_2.11:1.2.0 到一个齐柏林飞艇笔记本,但给出:“必须在初始化 SparkInterpreter (%spark) 之前使用” .但是没有在笔记本中使用 %spark %pyspark 或 %sql 怎么样? 不确定我是否理解。你能举个例子吗,@zero323? 您在笔记本中使用了%pyspark 还是%sql 【参考方案1】:

您需要先将 Spark Packages 存储库添加到 Zeppelin,然后才能在 spark 包上使用 %dep。

%dep
z.reset()
z.addRepo("Spark Packages Repo").url("http://dl.bintray.com/spark-packages/maven")
z.load("com.databricks:spark-csv_2.10:1.2.0")

或者,如果您希望在所有笔记本中都可以使用此功能,您可以在 Zeppelin 的解释器配置中将 --packages 选项添加到 spark-submit 命令设置,然后重新启动解释器。这应该启动一个已经按照 spark-shell 方法加载的包的上下文。

【讨论】:

%dep 现已弃用 (0.6.1)...见 Paul 的回答(使用 GUI) 是的。这应该在解释器配置中完成,如下 Paul 所述。 %dep 此时不应再被视为折旧。原因请参见 Paul-Armand 的回答。 不应使用此方法,因为使用此方法添加的 jar 不会分发给 spark executors。 @HarvinderSingh 你确定吗?这种方法确实将 jars 分发为它提交给 spark 的方式的一部分,这就是为什么这些注释必须在 spark 解释器之前运行(至少在我测试过的旧版本的 zeppelin 中)。也就是说,此处建议的其他方法为较新版本提供了更简洁的替代方案。【参考方案2】:
    转到解释器选项卡,单击存储库信息,添加一个存储库并将 URL 设置为http://dl.bintray.com/spark-packages/maven 向下滚动到 spark 解释器段落并单击编辑,向下滚动到工件字段并添加“com.databricks:spark-csv_2.10:1.2.0”或更新版本。然后在询问时重新启动解释器。

    在笔记本中,使用如下内容:

    import org.apache.spark.sql.SQLContext
    
    val sqlContext = new SQLContext(sc)
    val df = sqlContext.read
        .format("com.databricks.spark.csv")
        .option("header", "true") // Use first line of all files as header
        .option("inferSchema", "true") // Automatically infer data types
        .load("my_data.txt")
    

更新:

在 Zeppelin 用户邮件列表中,Moon Soo Lee(Apache Zeppelin 的创建者)现在(2016 年 11 月)表示,用户更愿意保留 %dep,因为它允许:

笔记本中的自记录库要求; 按注释(可能按用户)加载库。

现在的趋势是保留 %dep,因此此时不应将其视为折旧。

【讨论】:

我不确定您所说的“创建回购”是什么意思。在我的 Zeppelin 解释器选项卡中,我可以创建一个全新的解释器环境。另外,我有针对字段zeppelin.dep.additionalRemoteRepository 的 Spark 包 URL,那么我应该如何让它加载 CSV 包? @martin 通过单击“创建”按钮左侧的齿轮图标创建一个 repo(存储库)(用于创建一个全新的解释器环境,这不是您想要的)。这应该会展开可用的存储库列表,并显示一个“+”按钮。单击“+”按钮并将dl.bintray.com/spark-packages/maven 添加为 URL。然后,您可以按照步骤 2 和 3 进行操作。至于您的其他问题,在 zeppelin.dep.additionalRemoteRepository 中有该 URL 是正常的。由于在步骤 1 中添加了外部存储库,因此现在可以解决此依赖项。【参考方案3】:

开始编辑

%dep 在 Zeppelin 0.6.0 中已弃用。请参考 Paul-Armand Verhaegen 的回答。

如果您使用早于 0.6.0 的 zeppelin,请在此答案中进一步阅读

结束编辑

您可以使用 %dep 解释器加载 spark-csv 包。

喜欢,

%dep
z.reset()

// Add spark-csv package
z.load("com.databricks:spark-csv_2.10:1.2.0")

参见https://zeppelin.incubator.apache.org/docs/interpreter/spark.html中的依赖加载部分

如果你已经初始化了 Spark Context,快速的解决方案是重启 zeppelin,先用上面的代码执行 zeppelin 段落,然后执行你的 spark 代码读取 CSV 文件

【讨论】:

当我尝试这样做时,我得到“错误:未找到:值 % %dep”。想法? 不,但是您使用的是什么版本的 zeppelin?我刚刚从源代码构建它,一切都很好 正如上面提到的皮特:dep 现在被贬低了(0.6.1)...见保罗的回答(使用 GUI) %dep 此时不应再被视为折旧。原因请参见 Paul-Armand 的回答。【参考方案4】:

可以在 Spark Interpreter 依赖项下添加 jar 文件:

    点击导航栏中的“解释器”菜单。 点击 Spark 解释器的“编辑”按钮。 填充工件并排除字段。 按“保存”

【讨论】:

【参考方案5】:

如果你在 conf/zeppelin-env.sh 中定义

export SPARK_HOME=<PATH_TO_SPARK_DIST>

Zeppelin 然后会在 $SPARK_HOME/conf/spark-defaults.conf 中查找,您可以在那里定义 jar:

spark.jars.packages                com.databricks:spark-csv_2.10:1.4.0,org.postgresql:postgresql:9.3-1102-jdbc41

然后看看

http://zepplin_url:4040/environment/ 用于以下内容:

spark.jars 文件:/root/.ivy2/jars/com.databricks_spark-csv_2.10-1.4.0.jar,文件:/root/.ivy2/jars/org.postgresql_postgresql -9.3-1102-jdbc41.jar

spark.jars.packages com.databricks:spark-csv_2.10:1.4.0,org.postgresql:postgresql:9.3-1102-jdbc41

更多参考:https://zeppelin.incubator.apache.org/docs/0.5.6-incubating/interpreter/spark.html

【讨论】:

【参考方案6】:

另一种解决方案:

在 conf/zeppelin-env.sh(对我来说位于 /etc/zeppelin)中添加以下行:

export SPARK_SUBMIT_OPTIONS="--packages com.databricks:spark-csv_2.10:1.2.0"

然后启动服务。

【讨论】:

以上是关于使用 spark-csv 在 zeppelin 中读取 csv 文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 spark-csv 编写单个 CSV 文件

Spark:spark-csv 花费的时间太长

spark-csv 包中的 inferSchema

如何为 spark-csv 提供 parserLib 和 inferSchema 选项

Apache Zeppelin - 如何在 Apache Zeppelin 中使用 Helium 框架

在 Zeppelin 中如何使用 Hive