← Point72 Asset Management Interview Insights

Point72 Asset Management·Software Engineer·Online Assessment (OA)·Intermediate

Intermediate
Jun 2026

Summary

Point72 gave me a PySpark coding problem as part of their data engineering interview. It was a self-contained OA with a skeleton codebase and unit tests to pass, which I actually prefer over live coding with someone watching you.

Questions Asked (1)

Q1

Implement a PySpark job class for bank data mining. The class needs four methods: one to initialize a local SparkSession, one to join accounts and transactions filtering out rows where the transfer amount exceeds the source account balance or the destination account doesn't exist, one to return the count of distinct source account numbers, and one to return the top 10 source accounts by transaction count as a dictionary.

Algorithms & Data StructuresTechnical Trade-offs
Author's notes

The filtering logic in the second method is where I spent most of my time.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the data schema and business rules, then outline the class structure with a SparkSession builder and lazy evaluation. For the join and filtering, use a broadcast join on accounts and apply conditions to exclude invalid transfers. Finally, implement the aggregation methods using distinct count and groupBy with orderBy/limit, returning results as a dictionary.

Pro tip: Mention that you would cache the filtered DataFrame if it's reused across methods, and discuss the trade-off between broadcast joins and shuffle joins based on data size.

1. Clarify requirements and schema

Ask about the expected schema of accounts and transactions DataFrames, and confirm the exact filtering conditions (e.g., amount > balance, missing destination).

2. Design class and SparkSession initialization

Create a class with a method to initialize a local SparkSession using builder with appName and master('local[*]').

3. Implement join and filtering

Join transactions with accounts on source and destination account numbers, then filter out rows where amount > source balance or destination is null.

4. Implement aggregation methods

For distinct source count, use select('source_account').distinct().count(). For top 10, groupBy source_account, count, orderBy desc, limit 10, and collect as dictionary.

5. Discuss optimizations and edge cases

Consider broadcast join for accounts, caching, and handling nulls or negative amounts. Also discuss partitioning and skew.

Key Points to Mention

  • Use of broadcast join for small accounts DataFrame to avoid shuffling large transactions.
  • Filtering conditions: amount <= source_balance and destination exists (non-null).
  • Distinct count using approxCountDistinct if exact count is not required, but exact is fine.
  • Top 10 using groupBy, count, orderBy desc, limit, and collect to dictionary.
  • Caching the filtered DataFrame if reused in multiple methods.
  • Handling of nulls and data types (e.g., decimal for amounts).

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.