Pyspark中的增量数据加载和查询,无需重新启动Spark JOB

时间:2017-09-14 11:36:57

标签: apache-spark pyspark spark-dataframe pyspark-sql

大家好我想做增量数据查询。

  df = spark .read.csv('csvFile', header=True)  #1000 Rows
  df.persist() #Assume it takes 5 min
  df.registerTempTable('data_table') #or createOrReplaceTempView
  result = spark.sql('select * from data_table where column1 > 10') #100 rows
  df_incremental  = spark.read.csv('incremental.csv') #200 Rows
  df_combined = df.unionAll(df_incremental)
  df_combined.persist() #It will take morethan 5 mins, I want to avoid this, because other queries might be running at this time
  df_combined.registerTempTable("data_table")
  result = spark.sql('select * from data_table where column1 > 10') # 105 Rows.
  1. 将csv / mysql表数据读入spark数据帧。

  2. 将数据帧保留在内存中(原因:我需要性能和我的数据集可以适合内存)

  3. 注册为临时表并运行spark sql查询。 #Till这个我的火花工作是UP和RUNNING。

  4. 第二天,我将收到一个增量数据集(在temp_mysql_table或csv文件中)。现在我想在Total set i上运行相同的查询:e persisted_prevData + recent_read_IncrementalData。我将其称为mixedDataset。 ***无法确定增量数据何时进入系统,每天可以发送30次。

  5. 直到这里我也不想让火花应用程序崩溃。它应该始终是Up。而且我需要使用相同的时间度量查询mixedDataset的性能,就好像它是持久的一样。

  6. 我的担忧:

    1. 在P4中,我是否需要取消使用prev_data并再次保留prev& Incremantal数据的union-Dataframe?
    2. 我最重要的担心是我不想重新启动Spark-JOB来加载/启动更新数据(只有当服务器出现故障时,我必须重新启动)。
    3. 因此,在高层次上,我需要动态查询(更快性能)数据集+ Incremnatal_data_if_any。

      目前我正在通过为所有数据创建文件夹来执行此练习,并且增量文件也放在同一目录中。每隔2-3小时,我重新启动服务器,我的sparkApp开始读取该系统中存在的所有csv文件。然后在它们上运行查询。

      尝试探索hive persistentTable和Spark Streaming,如果发现任何结果,将在此处更新。

      请建议我采用一种方法/架构来实现这一目标。

      如果对问题一无所知,请发表评论,不要低估它:)

      感谢。

1 个答案:

答案 0 :(得分:1)

尝试使用流式传输,因为会话已经运行会更快,每次在文件夹中放置内容时都会触发:

df_incremental = spark \
    .readStream \
    .option("sep", ",") \
    .schema(input_schema) \
    .csv(input_path)

df_incremental.where("column1 > 10") \
    .writeStream \
    .queryName("data_table") \
    .format("memory") \
    .start()

spark.sql("SELECT * FROM data_table).show()