confusing inner join in pyspark - pyspark

I use inner join in pyspark shell like this:
tab_df=ori_df.join(ori_df,ori_df.columns,'inner')
Since I use the same table for inner join , it should be expected that the tab_df.count() should be equal as the ori_df.count(), but the tab_df.count() give me 0!

use this command :
tab_df = ori_df.join(ori_df, ['column_name'])
pyspark uses inner join by default
I tried in my computer to join two same tables and it works
Why do you want to join two same tables anyway ?

Then you can use subtract() method of pyspark.
To know whether the two dataframes are equal.

Related

Which join type is used when using just JOIN in PostgreSql?

I prefer to indicate join types when I use it in database systems but when I switch to a new project, there is a single join is used. Generally I prefer to use LEFT JOIN or INNER JOIN according to my needs, but I have not found which JOIN type is considered when a single JOIN is used in PostgreSQL.
select p.uuid from Product s " +
join Category c on p.uuid = c.siteUuid
join Brand b on b.uuid = c.brandUuid
Inner Join is the default join when we use plain JOIN.
For better readablity of the queries, It is always preferred to write INNER JOIN
Reference:
https://www.postgresql.org/docs/current/queries-table-expressions.html#id-1.5.6.6.5.6.4.3.1.2

How to optimize a query with several join?

I have to write on paper a good physical plan for a Postgresql's query with several natural join, is it the same as treating a query with a simple join or should I use a different approach?
I am working on this one, by the way
SELECT zname
FROM Cage natural join Animal natural join DailyFeeds natural join Zookeeper
WHERE shift=’const’ AND clocation=’const’;
By Oracle
A NATURAL JOIN is a JOIN operation that creates an implicit join
clause for you based on the common columns in the two tables being
joined. Common columns are columns that have the same name in both
tables.
I think the above is answering following
is it the same as treating a query with a simple join or should I use a different approach?
I hope it helps.

Can I combine USING and ON in a single join?

I'm using PostgreSQL 9.5. I'd like to have the column-merging functionality of USING in a query where not all of the columns that I'm using for the join are named the same. For example:
SELECT
*
FROM table_a a
INNER JOIN table_b b USING(shared_id) AND a.foo = b.bar
The above code doesn't work. Is there something I can write to get this effect? Or do I need to do ON a.shared_id = b.shared_id AND a.foo = b.bar?
You CAN'T use both
http://www.postgresql.org/docs/9.5/static/queries-table-expressions.html
The join condition is specified in the ON or USING clause, or implicitly by the word NATURAL. The join condition determines which rows from the two source tables are considered to "match", as explained in detail below.
Focus on the or part. ON or USING

Which JOIN is correct to use when using FUNCTION?

Take this sample code...
SELECT Persons.name,
getCarModelID(Persons.ID) AS car_model -- < A function
FROM Persons
LEFT OUTER JOIN Cars ON getCarModelID(Persons.ID) = Cars.ID
In the sample above, is it correct to use "LEFT OUTER JOIN"?
If you are planning to join a table with a function then you will need to use the T-SQL "Outer Apply" operator. Similar to Left Join you used and the above will be possible.
Joins can only join two or more tables but not a table with a function.
You can learn using Apply from this link.
The correct code will be as:
SELECT Persons.name,
getCarModelID(Persons.ID) AS car_model -- < A function
FROM Persons
OUTER APPLY Cars ON getCarModelID(Persons.ID) = Cars.ID;

PostgreSQL Full Outer Join Using Position

Why is it that in PostgreSQL you cannot use:
FULL OUTER JOIN
. . .
ON POSITION(table1.column1 IN table2.column1) <> 0,
But you can accomplish the same thing with a left join and a right join and then using a union all to join the results. It's the same exact result set that I want and I feel it should be possible since it's possible to just do the right and left join manually. I can live with having to do it, but it'd be a lot simpler to write with just using a Full Outer Join.