通过 Zeppelin 访问 HDFS 数据

Posted

技术标签:

【中文标题】通过 Zeppelin 访问 HDFS 数据【英文标题】:Access HDFS data through Zeppelin 【发布时间】:2019-01-26 04:22:18 【问题描述】:

我正在尝试使用 Spark 解释器。

这是我的代码:

val bankText = sc.parallelize(hdfs://hadoop:8020/user/zeppelin/bank.csv)

case class Bank(age: Integer, job: String, marital: String, education: String, balance: Integer)

val bank = bankText.map(s => s.split(";")).filter(s => s(0) != "\"age\"").map(
    s => Bank(s(0).toInt, 
            s(1).replaceAll("\"", ""),
            s(2).replaceAll("\"", ""),
            s(3).replaceAll("\"", ""),
            s(5).replaceAll("\"", "").toInt
        )
).toDF()
bank.registerTempTable("bank")

我在输出提示中没有收到任何错误,但是我在右上角收到错误消息。

这是截图。

【问题讨论】:

尝试在您的数据框“bank”上显示数据框,然后查看 zeppelin 日志中是否有任何错误 为什么要设置hdfs://hadoop:8020? Spark 是否尚未配置到 Hadoop?你能在 Spark shell 中正常运行这段代码吗?此外,您应该使用 SparkCSV 阅读器来读取带有; 分隔符的文件。 (使用拆分并不完美) @cricket_007 我的主要目标是从 zeppelin 访问 hdfs 数据,代码是从 zeppelin 示例中复制的,我可以更改代码。 请查看解释器日志 “Zeppelin”代码不是一个东西。 Zeppelin(很可能)不是问题,您的 Spark 配置是,必须在 Zeppelin 之外进行编辑...因此,请尝试使用 Spark shell,让它工作,然后继续设置齐柏林飞艇 【参考方案1】:

你的主要问题是这样的陈述:

val bankText = sc.parallelize(hdfs://hadoop:8020/user/zeppelin/bank.csv)

我假设你的意思是:

val bankText = sc.parallelize("hdfs://hadoop:8020/user/zeppelin/bank.csv")

但是这个,虽然它会编译,但不会给你你所期望的。 parallelize() 用于将 Scala Seq(在本例中为 String)转换为 RDD,其中每一行都是 Seq 的成员。换句话说,您将拥有一个 RDD,其中每一行都是字符串 "hdfs://hadoop:8020/user/zeppelin/bank.csv" 中的一个字符。第一行是“h”,第二行是“d”,依此类推。

长话短说,要从 HDFS 中的字符分隔文件中读取,您想要的命令是

val bankText = spark.read.option("sep", ";").csv("hdfs://hadoop:8020/user/zeppelin/bank.csv")

【讨论】:

以上是关于通过 Zeppelin 访问 HDFS 数据的主要内容,如果未能解决你的问题,请参考以下文章

Apache Zeppelin - 断开连接状态

Apache zeppelin绑定模式

如何在 apache zeppelin 中使用 hdfs shell 命令?

是否可以通过 IAM 角色限制从 EMR (zeppelin) 访问 S3 数据?

无法在 Spark 中将文件写入 Zeppelin 上的远程 hdfs

Spark On Zeppelin