Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 如果在列表中的任意一组点之间,则筛选Spark数据帧_Performance_Scala_Apache Spark_Spark Dataframe - Fatal编程技术网

Performance 如果在列表中的任意一组点之间,则筛选Spark数据帧

Performance 如果在列表中的任意一组点之间,则筛选Spark数据帧,performance,scala,apache-spark,spark-dataframe,Performance,Scala,Apache Spark,Spark Dataframe,我有一个spark数据帧(使用scala接口),它包含时间戳、资产(字符串)、标记(字符串)和值(双精度)列。以下是它的摘录: +--------------------+-----+--------+-------------------+ | timestamp|asset| tag| value| +--------------------+-----+--------+-------------------+ |2013-01-03

我有一个spark数据帧(使用scala接口),它包含时间戳、资产(字符串)、标记(字符串)和值(双精度)列。以下是它的摘录:

+--------------------+-----+--------+-------------------+
|           timestamp|asset|     tag|              value|
+--------------------+-----+--------+-------------------+
|2013-01-03 23:36:...|   G4| BTGJ2_2|      116.985626221|
|2013-01-15 00:36:...|   G4| TTXD1_6|       66.887382507|
|2013-01-05 13:03:...|   G4|TTXD1_22|       40.913497925|
|2013-01-12 04:43:...|   G4|TTXD1_23|       60.834510803|
|2013-01-08 17:54:...|   G4|   LTB1D|      106.534744263|
|2013-01-02 04:15:...|   G4|    WEXH|      255.981292725|
|2013-01-07 10:54:...|   G4| BTTA1_7|      100.743843079|
|2013-01-05 11:29:...|   G4| CDFH_10|      388.560668945|
|2013-01-10 09:10:...|   G4|   LTB1D|      112.226242065|
|2013-01-13 15:09:...|   G4|TTXD1_15|       63.970848083|
|2013-01-15 01:23:...|   G4|    TTIB|       67.993904114|
我还有一个
数组[List[Timestamp]]
,其中每个
列表的大小为2,并为感兴趣的间隔保留开始和结束时间。例如:

event_times: Array[List[java.sql.Timestamp]] = Array(List(2013-01-02 00:00:00.0, 2013-01-02 12:00:00.0), List(2013-01-10 00:00:00.0, 2013-01-12 06:00:00.0))
持有两个感兴趣的时间间隔:一个从2013-01-02的午夜到12:00,另一个从2013-01-10的午夜到2013-01-12的6:00

我的问题是:如何过滤数据帧以返回值,从而使时间戳位于任何时间间隔内?对于任何一个间隔,我都能做到

df.filter(df("timestamp").between(start, end))
因为我不知道
数组中有多少元素(我有多少间隔),所以我不能只使用一系列长的过滤器

对于上面的示例,我希望保留第4、6和9行


我现在拥有的是
数组上的一个循环
,并且正在为每个数组获取适当的子集。但是,这可能比将所有内容都放在一个大过滤器中要慢,对吗?

您可以将时间戳列表转换为数据帧,并将其与相应时间戳上的初始数据帧连接起来。我创建了一个简单的示例来说明此过程:

//Dummy data
val data = List(
  ("2013-01-02 00:30:00.0", "116.985626221"),
  ("2013-01-03 00:30:00.0", "66.887382507"),
  ("2013-01-11 00:30:00.0", "12.3456")
)

//Convert data to DataFrame
val dfData = sc.parallelize(data).toDF("timestamp", "value")

//Timestamp intervals list
val filterList = Array(
  List("2013-01-02 00:00:00.0", "2013-01-02 12:00:00.0"), 
  List("2013-01-10 00:00:00.0", "2013-01-12 06:00:00.0")
)

//Convert the intervals list to a DataFrame
val dfIntervals = sc.parallelize(
  filterList.map(l => (l(0),l(1)))
).toDF("start_ts","end_ts")

//Join both dataframes (inner join, since you only want matching rows)
val joined = dfData.as("data").join(
  dfIntervals.as("inter"), 
  $"data.timestamp".between($"inter.start_ts", $"inter.end_ts")
)

对不起,我没有得到你想要的。你能举个清楚的例子吗?@ThiagoBaldim我刚刚更新了一个例子。