使用 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 来获取每一行并进行转换。这将需要一个实际上不能传递给 map 函数的 sqlContext,因为它失败并出现以下错误:
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/

10-16 06:38