通过 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 中使用 hdfs shell 命令?
是否可以通过 IAM 角色限制从 EMR (zeppelin) 访问 S3 数据?