apache-spark - 将数据从 dstream 写入 parquet

标签 apache-spark apache-spark-sql spark-streaming pyspark

使用 pyspark 从 kinesis 消费数据后,我有一个包含如下条目的 dstream:

('filename_1', [{'name': 'test'}, {'name': 'more'}, {'name': 'other'}])
('filename_2', [{'age': 15}, {'age': 25}])

我现在要做的是将元组的第二部分写入元组第一部分标识的位置。

在其他地方,我通过使用以下方法将每个字典列表转换为 DataFrame 来做到这一点:
dataframe = sqlContext.createDataFrame(list_of_dicts)

并用以下内容编写它:
dataframe.write.parquet('filename')

我现在的问题是如何将 dstream 中的每一行转换为 DataFrame。我的直觉是使用 map 来获取每一行并进行转换。这将需要一个 sqlContext ,您实际上无法将其传递给 map 函数,因为它因以下错误而失败:
Exception: It appears that you are attempting to reference SparkContext from a broadcast variable, action, or transforamtion. SparkContext can only be used on the driver, not in code that it run on workers. For more information, see SPARK-5063

我并不完全依赖于 Parquet ,但我需要某种模式(因此绕道到 DataFrame)。有没有办法用 Spark 做到这一点?

最佳答案

您可以在 foreach 中创建 SqlContext 的新实例方法。

words.foreachRDD(
  new Function2<JavaRDD<String>, Time, Void>() {
    @Override
    public Void call(JavaRDD<String> rdd, Time time) {
      SQLContext sqlContext = JavaSQLContextSingleton.getInstance(rdd.context());

有关更多详细信息,您可以通过此 link .

关于apache-spark - 将数据从 dstream 写入 parquet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31672398/

相关文章:

apache-spark - 按一列中的唯一值随机拆分 DataFrame

scala - 在 Spark 中以结构化流模式获取 Offset 的消息正在重置

scala - 对 DStream 进行排序并取 topN

scala - 函数式编程原理

scala - 什么版本库spark支持SparkSession

scala - select后的spark sql where子句

scala - 使用 Spark DStream 作为 Akka 流的源的惯用方式

python - Spark pandas_udf 并不更快

java - 针对不可序列化对象和函数的 Spark Scala 编程

java - 记录层次结构并将 Spark log4j Logger 附加到其中